Hardware Algorithm for Complex-Valued Exponentiation and Logarithm Using Simplified Sub-Steps

ABSTRACT

A method of generating complex exponentiation and logarithms in hardware is described that uses half the number of bits of lookup tables as the state-of-the-art. By splitting up each of the iterations into more simplified stages or using more iterations, the amount of precomputed information that must be held by the circuitry is reduced. This allows synthesis tools to take this more succinct logical description of the algorithm and make it into efficient gate level logic for fabrication into more compact integrated circuitry.

PRIOR APPLICATIONS

This application claims the benefit of U.S. Provisional Patent Application No. 62/914,487 filed on Oct. 13, 2019, which is incorporated by reference in its entirety.

The prior application, U.S. application Ser. No. 15/839,184 filed on Dec. 12, 2017, is incorporated by reference in its entirety.

The prior application, U.S. Application No. 62/594,687 filed on Dec. 5, 2017, is incorporated by reference in its entirety.

FIELD OF THE DISCLOSURE

The present disclosure relates generally to developing and applying hardware algorithms for complex-valued exponentiation and logarithm using simplified sub-steps.

BACKGROUND

The BKM algorithm is a shift-and-add algorithm for computing elementary functions, first published in 1994 by Jean-Claude Bajard, Sylvanus Kla, and Jean-Michel Muller. BKM is based on computing complex logarithms (L-mode) and exponentials (E-mode) using a method similar to the algorithm Henry Briggs used to compute logarithms. By using a precomputed table of logarithms of negative powers of two, the BKM algorithm computes elementary functions using only integer add, shift, and compare operations.

BKM is similar to CORDIC but uses a table of logarithms rather than a table of arctangents. On each iteration, a choice of coefficient is made from a set of nine complex numbers, 1, 0, −1, i, −i, 1+i, 1−i, −1+i, −1−i, rather than only −1 or +1 as used by CORDIC. BKM provides a simpler method of computing some elementary functions, and unlike CORDIC, BKM needs no result scaling factor. The convergence rate of BKM is approximately one bit per iteration, like CORDIC, but BKM requires more precomputed table elements for the same precision because the table stores logarithms of complex operands.

As with other algorithms in the shift-and-add class, BKM is particularly well-suited to hardware implementation. The relative performance of software BKM implementation in comparison to other methods such as polynomial or rational approximations will depend on the availability of fast multi-bit shifts (i.e. a barrel shifter) or hardware floating point arithmetic.

Previously disclosed was an approach to recast the complex exponentiation and logarithm problem from the classical manipulation r+iθ↔e^(r+iθ) using the BKM algorithm, to the manipulation r+iθ↔2^(r)(e^(π/2))^(iθ) using a revised algorithm which shall be referred to as the BKML algorithm. This revised BKML algorithm takes the form of two algorithms, each the reverse of the other, one to compute:

f(r+iθ)=2^(r)(e ^(π/2))^(iθ),

as well as its inverse:

${f^{- 1}\left( {r + {i\theta}} \right)} = {{\frac{\arg \left( {r + {i\theta}} \right)}{\pi/2}i} + {\log_{2}{{\left. {r + {i\theta}} \right|,}}}}$

wherein the real part of the logarithm has a base of 2 and the imaginary part has a base of e^(π/2).

With some modifications, this can apply to any power-of-two base for the real part, and any power-of-two multiplied by pi and exponentiated for the base of the imaginary part. As the real and imaginary part of the process has a different base, the mathematical part of the process described that was implemented was novel and was not named initially. In this document, it shall be described and claimed as an ‘affine logarithm’ or ‘affine exponential’. The process shall be described as an ‘affine logarithm process’ or ‘exponential-to-logarithm process’ and an ‘affine exponential process’ or ‘logarithm-to-exponential process’ interchangeably. This is proceeded by a series of n steps choosing a value d_(n) for each in turn, where:

d _(n)∈{0,+1,+i,−1,+i,−1−i,−1+i,+1−i,+1+i},

and on the first of the complex values, we multiply by:

1+2^(−n)

and use the logarithm of this value precomputed in table to attenuate the second complex value.

Through repeated choices of d_(n) over n iterations, the iteration causes the first value to converge to the exponential and the second value converge to zero. The reverse operation is also possible using much the same process allowing for much the same hardware to be run in a logarithm or exponentiation ‘mode’. Without loss of generality, due to the structure of the set from which d_(n) is chosen, the storage cost of table is the number of bits to compute, say N, multiplied by the number of symmetries (usually the total number of non-zero choices of d_(n)) here eight (if the existing algorithm is expanded fully, this is five real lookups and three imaginary ones). This is a lookup size of 8N over each of N stages, yielding 8N² bits dedicated to lookup tables when an implementation of the BKML algorithm is used.

A further reason that the use of the prior art BKM algorithm is not well known and in widespread use is because the tabulated values take up a large amount of room in a silicon implementation that could be dedicated to other tasks. This is a weakness shared by the BKML implementation of the revised algorithm computing r+iθ↔2^(r)(e^(π/2))^(iθ) disclosed previously.

While it is difficult to determine precisely, it is quite possible that if eight lookup tables are necessary, computing the real and imaginary parts of the logarithm separately without using the combined iteration demonstrated by the BKM algorithm and the previously disclosed BKML algorithm will in many cases be more efficient with respect to hardware logic complexity and area—a drawback shared by the original BKM algorithm.

The requirement for eight lookup tables is considered to be due to the difficulty in achieving convergence in its classical r+iθ↔e^(r+iθ) form when the BKM algorithm was conceived by its authors. However, it is shown that with the change of base actioned when the BKML algorithm was invented previously, a new algorithm may be created that can overcome the need for eight look-up tables by requiring less stringent convergence criteria and therefore may be defined to need fewer resources.

In practice, in the process of looking for a form of the algorithm that requires fewer look-up tables, methods were found that may be applied even to the BKM algorithm.

SUMMARY

A method of generating complex exponentiation and logarithms in hardware is described that uses half the number of bits of lookup tables as the state-of-the-art. By splitting up each of the iterations into more simplified stages or using more iterations, the amount of precomputed information that must be held by the circuitry is reduced. This allows synthesis tools to take this more succinct logical description of the algorithm and make it into efficient gate level logic for fabrication into more compact integrated circuitry.

BRIEF DESCRIPTION OF THE DRAWINGS

The accompanying figures, where like reference numerals refer to identical or functionally similar elements throughout the separate views, together with the detailed description below, are incorporated in and form part of the specification, serve to further illustrate embodiments of concepts that include the claimed invention and explain various principles and advantages of those embodiments.

FIGS. 1A and 1B show illustration of errors in the complex plane in the logarithm-to-exponential process (floating-point implementation) for the BKML4m iteration.

FIGS. 2A and 2B show illustrations of errors in the complex plane in the exponential-to-logarithm process (floating-point implementation) for the BKML4m process.

FIGS. 3A and 3B show illustrations of errors in the complex plane in the logarithm-to-exponential process (floating-point implementation) for the BKML3dm iteration prior to the inclusion of the reduced entropy tables.

FIGS. 4A and 4B show illustration of errors in the complex plane in the exponential-to-logarithm process (floating-point implementation) for the BKML3dm prior to the inclusion of the reduced entropy tables.

Skilled artisans will appreciate that elements in the figures are illustrated for simplicity and clarity and have not necessarily been drawn to scale. For example, the dimensions of some of the elements in the figures may be exaggerated relative to other elements to help to improve understanding of embodiments of the present invention.

The apparatus and method components have been represented where appropriate by conventional symbols in the drawings, showing only those specific details that are pertinent to understanding the embodiments of the present invention so as not to obscure the disclosure with details that will be readily apparent to those of ordinary skill in the art having the benefit of the description herein.

DETAILED DESCRIPTION

This disclosure describes the orthogonalization of the sub-steps in real and imaginary parts to achieve a reduction in the number of lookup tables required for the algorithm and simplifications in the iterative procedure. Applying the orthogonalization to the previously disclosed BKML algorithm results in two algorithms. The first algorithm is more effective when low radix methods are considered, so when throughput and area are prioritized over latency (suitable for implementation in FPGA technologies). The second algorithm is more effective when high radix methods are considered, so when throughput and latency are prioritized over area (suitable for implementation into an application-specific integrated circuit (ASIC) or as an extended capability for a central processing unit (CPU) design).

The first, denoted BKML4m, requires four lookup values (which with some rewiring may be reduced to effectively three-and-a-half) per bit of result and chooses d_(n) in a similar way to BKML from nine candidates but with notable changes in the candidate set of d_(n) drawn from. The BKML4m algorithm requires no extra iterations over the extant previously disclosed BKML algorithm, requiring N radix-2 iterations to converge.

The second, denoted BKML3dm, requires three lookup values per bit of result, has a simplified method for choosing d_(n) from four candidates, essentially eliminating zero and on-axis d_(n) choices. BKML3dm requires some extra iterations to achieve convergence, taking approximately N+log N radix-2 iterations to converge. These extra steps are a problem at low radices, but the simplified choice mechanisms and reduced candidate pool means that this technique may be readily extended to very high radices, necessary for designing high-speed modern hardware. This is especially true since dealing with propagation delays makes arithmetic that need only be synchronized and resolved at key points in the algorithm valuable. Due to this, decision making based on fully resolved result values must be minimized, meaning that when this process generates multiple bits of result per decision step (has high radix) it is particularly effective at reducing latencies.

The value N takes is for brevity both the number of fraction bits and the number iterations of the method, without loss of generality. While these two properties can take different values, algorithms including such definitions are often of reduced effectiveness, involve trivial changes to the method and are thus are effectively included in the scope of this disclosure.

I. OPTIONAL MULTIPLICATION AND DIVISION

The exponentiation mode iteration for the method described may also be modified to provide a complex multiplication with the exponential value. If this is to be achieved, this must be pre-loaded before the range reduction steps if the output is to be correct. It should also be noted that this would replace the output exponentiation value and so should be not used if this value is required. It is also feasible to store and wait to apply the solution from the integer parts of the logarithm (the value z_(integer, output)) to the end of the process. This may reduce the storage required for the intermediate registers in which the processing occurs, although this should be weighed against the extra requirements of storage needed for the integer parts of the solution.

Alternatively, multiplication with the final exponentiation value may be achieved in parallel by creating extra registers and ensuring that equivalent operations occur in these extra registers. In this way, the exponentiation process may complex multiply the output exponential value with almost arbitrarily many other complex values with parallel hardware.

The logarithm mode iteration described may also be modified to provide a complex division with the input value. If this is to be achieved, it can only occur in parallel by creating extra registers and ensuring that equivalent operations occur in these extra registers. This contrasts with the auxiliary multiplication, where the original register could be overloaded, which cannot be achieved here because the modification of the exponentiation register in this mode would prevent convergence of the algorithm. However, using auxiliary registers can circumvent this, allowing the logarithm process to, if desired, produce complex-valued division of almost arbitrarily many other numerator complex values with the value input to this process as denominator.

II. RANGE REDUCTION

More efficient range reduction was one of the primary motivations for the previously disclosed BKML algorithm. This is preserved as an integral part of the algorithm in the presented reduced resource version in this disclosure. In the logarithm-to-exponential iteration, the integer real part of the logarithm input denotes the bit shift applied to either the output registers at the end of the process or initialization of the output registers to a power-of-two at the beginning of the process. The integer imaginary part of the input logarithm, due to the base of e^(π/2), denotes the quadrant (aligned to the axes) of the complex plane in which the resulting exponentiation result must lie. In the exponential-to-logarithm process the reverse is mostly true. The quadrant (aligned to the diagonals) of the complex plane is determined through testing the sign bits and absolute value of the real and imaginary components to give the integer part of the imaginary logarithm. By permuting signs of the real and imaginary parts and potentially swapping them, this rotation can be removed to yield a real part that is guaranteed to be positive and larger than the imaginary part. Counting leading zeroes of this real and larger part allows the integer part of the logarithm to be substantially determined. This substantial determination may be removed by bit shifting both components, such that the remaining portion of the real logarithm may be obtained via the iteration.

It may also be desirable to keep the integer portion determined by the range reduction step separate from the calculation for as long as possible. This allows the method to perform complex logarithm to floating-point complex exponential conversions that are highly useful in the context of wave physics applications. To achieve a true conversion to a standard floating-point type, the fractional part of the exponentiation may be tested to determine whether the result is too large or small for the mantissa to fit into a particular format, depending on the region of convergence decided upon by the reduced range algorithm. This is necessary because only the larger real part is tested to determine whether the value lies within the convergent region of the complex plane and the size of imaginary part is untested at this time but must be in a known range of values. A final test on the real part of the exponential mantissa and an increment or decrement on the exponential integer exponent then finalizes the representation ready for storage into the floating-point format. In the implementation described here, the complex value may be up to V in size (thus in the interval [0.5, √{square root over (2)})), which would if greater or equal to 1 require a divide-by-two and exponent increment to place into the region [0.5, 1) in which the integer part of the exponent is completely described by the exponent of the floating-point value.

III. MULTIPLICATIVE ITERATIONS IN THE COMPLEX PLANE

Noticing that each iteration requires that we multiply the running product by:

1+2^(−n)

if we choose the real part of d_(n) separately from the imaginary part we can choose:

∈{0,−1,+1},

{0,−i,+i}.

The iteration may be modified to perform the running product multiplied by the further product:

(+2^(−n)

)(1+2^(−n)

)=1+2^(−n)(

+

)+2^(−2n)

=1+2^(−n)(

+

+2^(−n)

).

on each iteration. As a result, the diagonal d_(n) which have both a real and an imaginary part have an extra factor of 2^(−2n)

which results in an extra shift (by 2n bit places) and add requirement for these schemes in the exponential part and a potential extra subtraction in the logarithm part. As using this scheme allows the number of lookup tables to be reduced from eight to four in the worst case, the extra shift and add requirement is more than compensated for as the four extra tables can be dropped as will be demonstrated.

IV. THE BKML4M VARIANT

Using d_(n) as highlighted in the previous section but keeping the structure of the algorithm mostly the same leads us to a similar algorithm to that disclosed previously but with a slightly different choice of d_(n) due to the cross terms. This can be written out as an effectively expanded table for a general d_(n):

${d_{n} \in \begin{Bmatrix} {0,} \\ {{- 1},} \\ {{+ 1},} \\ {{- i},} \\ {{+ i},} \\ {{{- 1} - i + {2^{- n}i}},} \\ {{{- 1} + i - {2^{- n}i}},} \\ {{{+ 1} + i + {2^{- n}i}},} \\ {{{+ 1} - i - {2^{­n}i}},} \end{Bmatrix}},$

Since the extra 2^(−n) terms in d_(n) are n bit places away from the bit currently under scrutiny at any given time, while these extra terms need to be accounted for, they only negligibly affect the convergence of the method. For the most part, this then converges in almost the same way as the original revised method in previous disclosures (although the previous method would necessarily have the disadvantage of requiring eight lookup tables). The changes to the choice of d_(n) amount to an extra shift-and-add in the product of the exponentials and an extra addition in the summation of the logarithms per iteration.

V. TABLE LOOKUP CONSTRUCTION

When considering the logarithm portion of each iterative method (both logarithm-to-exponential and exponential-to-logarithm), it can be shown that only four lookup tables containing the bit patterns of the logarithms need be constructed. These are:

${{\mspace{79mu} {{l_{n,{ +}} = \left. \log_{2} \middle| {1 + 2^{- n}} \right|},\mspace{79mu} {l_{n,{ -}} = \left. \log_{2} \middle| {1 - 2^{- n}} \right|},\mspace{79mu} {l_{n,{d}} = {\left. \log_{2} \middle| {1 \pm {2^{- n}i}} \right| = {{\log_{2}\sqrt{1^{2} + \left( {\pm 2^{- n}} \right)^{2}}} = {\frac{1}{2}{\log_{2}\left( {1 + 2^{{- 2}n}} \right)}}}}},\mspace{79mu} {l_{n,} = \left. {\frac{2}{\pi}\arg} \middle| {1 + {2^{- n}i}} \right.}}} = {\frac{2}{\pi}\tan^{- 1}2^{- n}}},$

Of these four, it is also possible to reduce it to effectively three and a half via the observation:

=½

where the preceding factor of a half may be a bit shift. By reusing table entries for

and extending to

only for even values (or producing a table of

only for even values after the other table has been exhausted) the remainder may be filled by using only half a table.

Then the logarithms to use for the addition/subtraction portion will be:

(1)=0,

(1−2^(−n))=

(1+2^(−n))=

(1−2^(−n) i)

−

(1+2^(−n) i)=

+

((1−2^(−n))(1−2^(−n) i)=

+

−

((1+2^(−n))(1−2^(−n) i)=

+

−

((1−2^(−n))(1+2^(−n) i)=

+

+

(1+2^(−n))(1+2^(−n) i))=

+

+

These are then added to the running total of the logarithm upon whose upper bits the decision as to the direction to take is chosen for the next iteration.

VI. BKML4M: EXPONENTIATION MODE ITERATION

With the mechanism using four look-up tables established, the method to achieve complex exponentiation using this approach can be described. The method and region cut-offs for choosing each d_(n) from the input are very similar to the revised algorithm which required eight look-up tables in the BKML algorithm disclosed prior to this. This allows the method to not require extra iterations to be inserted, because the only difference in the convergence between the previous revised algorithm and this is the extra 2^(−2n)

term, which has much less effect than the other terms in the expansion of the multiplication step.

Alternatively, multiplication with the final exponentiation value may be achieved in parallel by creating extra registers and ensuring that equivalent operations occur in these extra registers, as described in previous sections. In this way, the exponentiation process may complex multiply the output exponential value with almost arbitrarily many other complex values.

Assuming the fractional part of the input logarithms to be the input, the algorithm for the domain of convergence z_(input)∈R=[−0.5,+0.5)+i[−0.5,+0.5) is:

-   -   1. Assuming there are four basic registers, labelled         (z_(log)),         (z_(log)),         (z_(log)) and         (z_(log)). Alongside, there are two extra slave multiplication         registers         (z_(log)) and         (z_(log)) to demonstrate how the method operates when used for         auxiliary complex multiplication. The initial values of these         registers are:

(z _(log)):=

(z _(input)),

(z _(log)):=

(z _(input)),

(z _(exp)):=

(z _(integer input, output) ×z _(premultiply)),

(z _(exp)):=

(z _(integer input, output) ×z _(premultiply)),

-   -    where z_(premultiply)=1.0, if there are no requirements for         pre-multiplication. The slave multiplication registers may also         be similarly constructed with:

(z′ _(exp)):=

(z _(integer input, output) ×z′ _(premultiply)),

(z′ _(exp)):=

(z _(integer input, output) ×z′ _(premultiply)).

-   -   2. Iterate through the values 1, . . . N−1 as the index n:     -   3. Shift right by N−n and then truncate         (z_(log)) to form         (z_(log, test)) such that it has three bits; one sign bit and         two integer bits in two's complement such that the range is         [−4.0,+4.0) with the smallest change being 1. The multiplication         of this value by 2^(−n) is implied by the initial shift.     -   4. Shift right by N−(n+1) and then truncate         (z_(log)) to form         (z_(log, test)) such that it has three bits; one sign bit, one         integer bit and one fraction bit in two's complement such that         the range is [−2.0,+2.0) with the smallest change being 0.5. The         multiplication of this value by 2^(−n) is implied by the initial         shift.     -   5. Test the 3-bit values to determine d_(n):

${{\left( d_{n} \right)}:} = \left\{ {{\begin{matrix} {{- 1},\; {{{if}\mspace{14mu} {\left( z_{\log,{test}} \right)}} < {3^{\prime}{{sb}111}\mspace{20mu} \left( {{or}\  < {- {1.0}}} \right)}},} \\ {{+ 1},\ {{{if}\mspace{14mu} {\left( z_{\log,{test}} \right)}} > {3^{\prime}{{sb}000}\mspace{20mu} \left( {{or}\  \geq {{+ 1}{.0}}} \right)}},} \\ {0,\; {{if}{\mspace{11mu} \;}{neither}},} \end{matrix}{\left( d_{n} \right)}}:=\left\{ \begin{matrix} {{{- i},\; {{{if}\mspace{14mu} {\left( z_{\log,{test}} \right)}} < {3^{\prime}{{{sb}111}{\mspace{11mu} \;}\left( {{or}\; < {- 0.05}} \right)}}},}\;} \\ {{+ i},{{{if}\mspace{14mu} {\left( z_{\log,{test}} \right)}} > {3^{\prime}{{sb}000}\mspace{20mu} \left( {{or}\mspace{14mu} \geq {+ 0.5}} \right)}},} \\ {0,{{if}\mspace{14mu} {{n{either}}.}}} \end{matrix} \right.} \right.$

-   -   6. Apply the shift-and-add process effecting the multiplication         of the 2^(−n) terms to the exponential registers:

$\left. {\text{(}z_{\exp,n}} \right):={{\left( z_{\exp,{n - 1}} \right)} + {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ 1}},} \\ {{0,{{if}\mspace{14mu} {n{either}}},}\;} \end{matrix} + \left\{ {{\begin{matrix} {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ i}},} \\ {0,{{if}\mspace{14mu} {{n{either}}.}}} \end{matrix}{{And}:{\left( z_{\exp,n} \right)}}}:={{\left( z_{\exp,{n - 1}} \right)} + {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ 1}},} \\ {0,{{if}\mspace{14mu} {n{either}}},} \end{matrix} + \left\{ \begin{matrix} {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ i}},} \\ {0,{{if}\mspace{14mu} {{n{either}}.}}} \end{matrix} \right.} \right.}}} \right.} \right.}}$

-   -    Do the same to any auxiliary registers such as         (z′_(exp, n)) and         (z′_(exp, n)) to apply the multiplication process to these also.     -   7. Apply the shift-and-add process effecting the multiplication         of the 2^(−2n) term to the exponential registers. As this is the         cross-term of a real and imaginary part, it is guaranteed         imaginary, so it has a more limited set of possible         manifestations.         -   If             (d_(n))=−1 and             (d_(n))=+i or             (d_(n))=+1 and             (d_(n))=−i then 2^(−2n)             =−2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

-   -   -   Whereas if             (d_(n)=+1 and             (d_(n))=+i or             (d_(n))=−1 and             (d_(n))=−i then 2^(−2n)             =+2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

-   -   -   wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, n)) and             (z′_(exp, n)) to apply the multiplication process to these             also.

    -   8. Subtract the corresponding entry in the logarithm tables from         the registers:

${{\left( z_{\log,n} \right)}:={{\left( z_{\log,{n - 1}} \right)} - \left( {{\log_{2}{{1 + {2^{{- \prime}\iota}d_{n,}}}}} + {\log_{2}{{1 + {2^{- n}d_{n,}}}}}} \right)}},{= {{\left( z_{{{lo}g},{n - 1}} \right)} - {\left( {{\log_{}\left( {1 + {2^{- n}d_{n,}}} \right)} + {\log_{}\left( {1 + {2^{- n}d_{n,}}} \right)}} \right)}}},{= {{\left( z_{\log,{n - 1}} \right)} - \left( {{{table}_{}\left\lbrack {d_{n,},n} \right\rbrack} + {{table}_{}\left\lbrack {d_{\;^{n,}},n} \right\rbrack}} \right)}},{{\left( z_{\log,n} \right)}:={{\left( z_{\log,{n - 1}} \right)} - \left( {{\frac{2}{}\; {\arg \left( {1 + {2^{- n}d_{n,}}} \right)}} + {\frac{2}{}{\arg \left( {1 + {2^{- n}d_{n,}}} \right)}}} \right)}},{= {{\left( z_{\log,{n - 1}} \right)} - {\left( {{\log_{}\left( {1 + {2^{- n}d_{n,}}} \right)} + {\log_{}\left( {1 + {2^{- n}d_{n,}}} \right)}} \right)}}},{= {{\left( z_{\log,{n - 1}} \right)} - {\left( {{{table}_{}\left\lbrack {d_{n,},n} \right\rbrack} + {{table}_{}\left\lbrack {d_{n,},n} \right\rbrack}} \right).}}}$

-   -   -   This is achieved using the look-up table constructions             described in the previous section by log

    -   9. Return to step 2 for the next iteration, until N is reached,         at which point the registers will contain their final values:

(z _(exp, N)):=

(z _(integer input, output) ×z _(premultiply)×2

(e ^(π/2))

),

(z _(exp, N)):=

(z _(integer input, output) ×z _(premultiply)×2

(e ^(π/2))

),

And:

′(z _(exp, N)):=

(z _(integer input, output) ×z _(premultiply)×2

(e ^(π/2))

),

′(z _(exp, N)):=

(z _(integer input, output) ×z _(premultiply)×2

(e ^(π/2))

),

Having appreciated the form of the process, it is easy to find other testing procedures that are convergent, even sometimes in the required domain, by forming

(z_(log, test)),

(z_(log, test)) or both using different number of bits or different comparison values, although we have endeavored to reduce complexity by specifying the required value tests in the simplest known form.

An illustration of the application of this procedure to values z_(input)∈R=[−2.0,+2.0)+i[−2.0,+2.0) is shown in FIGS. 1A and 1B.

FIGS. 1A and 1B show illustration of errors in the complex plane in the logarithm-to-exponential process (floating-point implementation) for the BKML4m iteration. These figures correspond to illustrative tests of the iterative scheme in floating-point and with no range reduction steps to demonstrate the mathematical viability of the dynamical system rather than being a faithful reproduction of the iterative procedures outlined.

In FIG. 1A, shown is a simulation 1100A where the x-axis 1120A is real, and the y-axis 1110A is imaginary in the input to the algorithm. Shading denotes the error (where a black shading 1130A implies the error is linearly related to the bits and iterations of the algorithm).

In FIG. 1B, shown is a simulation 1100B where the x-axis 1120B is real, and the y-axis 1110B is imaginary in the input to the algorithm. The white square 1130B is constructed by inverting the color and denotes the portion of the domain (z_“input” “∈R”=[−0.5┤, ├+0.5)+i[−0.5┤, ├−+0.5)) which is required to be convergent. Therefore, if the algorithm functions in this zone, it is expected for the region to be shaded solid white.

VII. BKML4M: LOGARITHM MODE ITERATION

The logarithm mode described in this section may also be modified to provide a complex division with the input value. If this is to be achieved, it can only occur in parallel by creating extra registers and ensuring that equivalent operations occur in these extra registers. This contrasts with the auxiliary multiplication, where the original register could be overloaded, which cannot be achieved here because the modification of the exponentiation register in this mode would prevent convergence of the algorithm. However, using auxiliary registers can circumvent this by mirroring operations, allowing the logarithm process to, if desired, produce complex-valued division of almost arbitrarily many other complex values with the value input to this process as denominator.

Assuming the fractional part of the output logarithms to be the output, the algorithm for the domain of convergence z_(input)∈R=[+0.5,+1.0)+i[

(R),+

(R)) is:

-   -   1. Assuming there are four basic registers, labelled         (z_(log)),         (z_(log)),         (z_(exp)) and         (z_(exp)). Alongside, there are two extra slave division         registers         (z′_(exp)) and         (z′_(exp)) to demonstrate how the method operates when used for         auxiliary complex division. The initial values of these         registers are:

(z _(log)):=

(z _(integer output, output)),

(z _(log)):=

(z _(integer output, output)),

(z _(exp)):=

(z _(input))−1.0,

(z _(exp)):=

(z _(input)),

-   -   -   The slave division registers may also be similarly             constructed with:

(z _(exp)):=

(z _(numerator) ÷z _(integer output, input)),

(z _(exp)):=

(z _(numerator) ÷z _(integer output, input)).

-   -   -   Noting that the −1.0 is not applied to the registers             (z′_(exp)) and             (z′_(exp)).

    -   2. Iterate through the values 0, . . . , N−1 as the index n:

    -   3. Shift right by N−(n+3) and then truncate         (z_(exp)) to form         (z_(exp, test)) such that it has six bits; one sign bit, two         integer bits and three fraction bits in two's complement such         that the range is [−4.0,+4.0) with the smallest change being         0.125. The multiplication of this value by 2^(−n) is implied by         the initial shift.

    -   4. Shift right by N−(n+1) and then truncate         (z_(exp)) to form         (z_(exp, test)) such that it has four bits; one sign bit, two         integer bits and one fraction bits in two's complement such that         the range is [−4.0,+4.0) with the smallest change being 0.5. The         multiplication of this value by 2^(−n) is implied by the initial         shift.

    -   5. Test the two values to determine d_(n):

${\left( d_{n} \right)}:=\left\{ {{\begin{matrix} {{+ 1},\ {{{if}\mspace{14mu} {\left( z_{\exp,{test}} \right)}} < {6^{\prime}{{sb}111011}\mspace{20mu} \left( {{or}\  < {- 0.625}} \right)}},} \\ {{- 1},\ {{{if}\mspace{14mu} {\left( z_{\exp,{test}} \right)}} > {6^{\prime}{{{sb}000100}{\mspace{11mu} \mspace{9mu}}\left( {{or}\  \geq {+ 0.625}} \right)}}},} \\ {0,{{if}\mspace{14mu} {n{either}}},} \end{matrix}{\left( d_{n} \right)}}:=\left\{ \begin{matrix} {{+ i},\ {{{if}\mspace{14mu} {\left( z_{\exp,{test}} \right)}} < {4^{\prime}{{{sb}1111}{\mspace{11mu} \mspace{9mu}}\left( {{or}\  < {- 0.5}} \right)}}},} \\ {{- i},\ {{{if}\mspace{14mu} {\left( z_{\exp,{test}} \right)}} > {4^{\prime}{{{sb}0000}{\mspace{11mu} \mspace{9mu}}\left( {{or}\  \geq {+ 0.5}} \right)}}},} \\ {0,{{if}\mspace{14mu} {{n{either}}.}}} \end{matrix} \right.} \right.$

-   -   6. Apply the shift-and-add process effecting the multiplication         of the 2^(−n) terms to the exponential registers:

$\left. {\text{(}z_{\exp,n}} \right):={{\left( z_{\exp,{n - 1}} \right)} + {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}\left( {{\left( z_{\exp,{n - 1}} \right)} + 1} \right)} = {- \left( {{{sll}\left( {1,{F - n}} \right)} + {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}} \right)}},\mspace{14mu} {{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}\left( {{\left( z_{\exp,{n - 1}} \right)} + 1} \right)} = {+ \left( {{{sll}\left( {1,{F - n}} \right)} + {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}} \right)}},\mspace{14mu} {{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ 1}},} \\ {\mspace{230mu} {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}\mspace{14mu} {set}},}\;} \end{matrix} + \left\{ \begin{matrix} {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},\; {{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ i}},} \\ {0,{{if}\mspace{14mu} z_{{zero}\;}\mspace{14mu} {is}\mspace{14mu} {set}},} \end{matrix} \right.} \right.}}$

-   -    And:

${\left( z_{\exp,n} \right)}:={{\left( z_{\exp,{n - 1}} \right)} + {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ 1}},} \\ {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}\mspace{20mu} {set}},} \end{matrix} + \left\{ \begin{matrix} {{{{- 2^{- n}}\left( {{\left( z_{\exp,{n - 1}} \right)} + 1} \right)} = {- \left( {{{sll}\left( {1,{F - n}} \right)} + {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}} \right)}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{+ 2^{- n}}\left( {{\left( z_{\exp,{n - 1}} \right)} + 1} \right)} = {+ \left( {{{sll}\left( {1,{F - n}} \right)} + {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}} \right)}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ i}},} \\ {0,\; {{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}\mspace{20mu} {set}}} \end{matrix} \right.} \right.}}$

-   -   -   Do the same to any auxiliary registers such as             (z′_(exp)) and             (z′_(exp)) to apply the division process to these. However,             the register will not require the correction for the 1 in             the real part so instead the procedure would be:

$\left. {^{\prime}\text{(}z_{\exp,n}} \right):={{^{\prime}\left( z_{\exp,{n - 1}} \right)} + {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\left( {z^{\prime}}_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( {z^{\prime}}_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\left( {z^{\prime}}_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( {z^{\prime}}_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ 1}},} \\ {{0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}\mspace{20mu} {set}},}\;} \end{matrix} + \left\{ {{\begin{matrix} {{{{+ 2^{- n}}{\left( {z^{\prime}}_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( {z^{\prime}}_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{- 2^{- n}}{\left( {z^{\prime}}_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( {z^{\prime}}_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ i}},} \\ {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}{\mspace{11mu} \;}{{set}.}}} \end{matrix}{^{\prime}\left( z_{\exp,n} \right)}}:={{^{\prime}\left( z_{\exp,{n - 1}} \right)} + {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\left( {z^{\prime}}_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( {z^{\prime}}_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\left( {z^{\prime}}_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( {z^{\prime}}_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ 1}},} \\ {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}\mspace{14mu} {set}},} \end{matrix} + \left\{ \begin{matrix} {{{{- 2^{- n}}{\left( {z^{\prime}}_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( {z^{\prime}}_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{- 2^{- n}}{\left( {z^{\prime}}_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( {z^{\prime}}_{\exp,{n - 1}} \right)},n} \right)}}},{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {+ i}},} \\ {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}\mspace{14mu} {{se}t}}} \end{matrix} \right.} \right.}}} \right.} \right.}}$

-   -   7. Apply the shift-and-add process effecting the multiplication         of the 2^(−2n) term to the exponential registers. As this is the         cross-term of a real and imaginary part, it is guaranteed         imaginary, so it has a more limited set of possible         manifestations.         -   If             (d_(n))=−1 and             (d_(n))=+i or             (d_(n))=+1 and             (d_(n))=−i then 2^(−2n)             =−2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))−(sll(1,F−2n)+sra(

(z _(exp, n−1)),2n)),

-   -   -   Whereas if             (d_(n))=+1 and             (d_(n))=+i or             (d_(n))=−1 and             (d_(n))=−i then 2^(−2n)             =+2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))+(sll(1,F−2n)+sra(

(z _(exp, n−1)),2n)),

-   -   -   wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, n)) and             (z′_(exp, n)) to apply the division process to these also.             Crucially, in these cases the correction for the +1 should             be omitted.         -   If             (d_(n))=−1 and             (d_(n))=+i or             (d_(n))=+1 and             (d_(n))=−i then 2^(−2n)             =−2^(−2n)i:

(z′ _(exp, n)):=

(z′ _(exp, n))+sra(

(z′ _(exp, n−)),2n),

(z′ _(exp, n)):=

(z′ _(exp, n))−sra(

(z′ _(exp, n−)),2n),

-   -   -   Whereas if             (d_(n))=+1 and             (d_(n))=+i or             (d_(n))=−1 and             (d_(n))=−i then 2^(−2n)             +2^(−2n)i:

(z′ _(exp, n)):=

(z′ _(exp, n))−sra(

(z′ _(exp, n−)),2n),

(z′ _(exp, n)):=

(z′ _(exp, n))+sra(

(z′ _(exp, n−)),2n),

-   -   8. Subtract the corresponding entry in the logarithm tables from         the registers:

${{\left( z_{\log,n} \right)}:={{\left( z_{\log,{n - 1}} \right)} - \left( {{\log_{2}{{1 + {2^{{- \prime}\iota}d_{n,}}}}} + {\log_{2}{{1 + {2^{- n}d_{n,}}}}}} \right)}},{= {{\left( z_{{{lo}g},{n - 1}} \right)} - {\left( {{\log_{}\left( {1 + {2^{- n}d_{n,}}} \right)} + {\log_{}\left( {1 + {2^{- n}d_{n,}}} \right)}} \right)}}},{= {{\left( z_{\log,{n - 1}} \right)} - \left( {{{table}_{}\left\lbrack {d_{n,},n} \right\rbrack} + {{table}_{}\left\lbrack {d_{\;^{n,}},n} \right\rbrack}} \right)}},{{\left( z_{\log,n} \right)}:={{\left( z_{\log,{n - 1}} \right)} - \left( {{\frac{2}{}\; {\arg \left( {1 + {2^{- n}d_{n,}}} \right)}} + {\frac{2}{}{\arg \left( {1 + {2^{- n}d_{n,}}} \right)}}} \right)}},{= {{\left( z_{\log,{n - 1}} \right)} - {\left( {{\log_{}\left( {1 + {2^{- n}d_{n,}}} \right)} + {\log_{}\left( {1 + {2^{- n}d_{n,}}} \right)}} \right)}}},{= {{\left( z_{\log,{n - 1}} \right)} - {\left( {{{table}_{}\left\lbrack {d_{n,},n} \right\rbrack} + {{table}_{}\left\lbrack {d_{n,},n} \right\rbrack}} \right).}}}$

-   -   -   This is achieved using the look-up table constructions             described in the previous section by             .

    -   9. Return to step 2 for the next iteration, until N is reached,         at which point the registers will contain their final values:

(z _(log, N)):=log₂∥

(z _(input))+i

(z _(input))∥,

(z _(log, N)):=2/π arg(

(z _(input))+i

(z _(input))),

And:

(z′ _(exp, N)):=

(z _(numerator)÷(z _(integer output, input) ×z _(input))),

(z′ _(exp, N)):=

(z _(numerator)÷(z _(integer output, input) ×z _(input))),

Having appreciated the form of the process, it is possible to find other testing procedures that are convergent, often even in the required domain of the form of range reduction used here, by forming

(z_(exp, test)),

(z_(exp, test)) or both using different number of bits or different comparison values, although we have endeavored to reduce complexity by specifying the required value tests in the simplest known form.

An illustration of the application of this procedure to values z_(input∈R=[−)2.0,+2.0)+i[−2.0,+2.0) is shown in FIGS. 2A and 2B.

FIGS. 2A and 2B show illustrations of errors in the complex plane in the exponential-to-logarithm process (floating-point implementation) for the BKML4m process. These figures correspond to illustrative tests of the iterative scheme in floating-point and with no range reduction steps to demonstrate the mathematical viability of the dynamical system rather than being a faithful reproduction of the iterative procedures outlined.

In FIG. 2A, shown is a simulation 1200A where the x-axis 1220A is real, and the y-axis 1210A is imaginary in the input to the algorithm. Shading denotes the error (where a black shading 1230A implies the error is linear related to the bits and iterations of the algorithm).

In FIG. 2B, shown is a simulation 1200B where the x-axis 1220B is real, and the y-axis 1210B is imaginary in the input to the algorithm. The white trapezoid 1230B is constructed by inverting the color and denotes the portion of the domain (z_(input)∈R=[+0.5,+1.0)+i[−

(R), +

(R))) which is required to be convergent. Therefore, if the algorithm functions in this zone, it is expected for the region to be shaded solid white. Branch cut artifacts have been compensated for on the real line.

VIII. BKML4M: UNIFIED LOGARITHM-TO-EXPONENTIAL AND EXPONENTIAL-TO-LOGARITHM ALGORITHM

Both directions can be unified into a single algorithm that can flip direction based on a bit switch.

IX. SIMPLIFICATION OF THE CONVERGENCE TEST

The first point to note when unifying the algorithms is that the ‘correction’ of the exponential in the exponential-to-logarithm, wherein the value is shifted so the origin is moved to zero by subtracting one, is only required by the test step. This means that the correction can be temporarily applied to the value under test on each iteration. This is further simplified by the fact that adding or subtracting high bits affects only the bits to the left of the other operand value, so a relatively large change of 1 can be made to affect only a single bit which is flipped when the exponential-to-logarithm mode is engaged via the bit switch.

X. REDUCED ENTROPY TABLE

It can be observed that:

${\frac{2\tan^{- 1}2^{- p}}{} \approx {{\frac{1}{2}\log_{2}1} + 2^{- p}}},$

therefore, at the expense of an extra operation to correct for the error, a smaller table of corrections to the value log₂ 1+2^(−p) may be stored instead of a lookup table for the value

$\frac{2\tan^{- 1}2^{- p}}{\pi}.$

As the extra operation is inexpensive in logic compared to the full storage of the table, this is a way to encode operations using the fourth table storing the imaginary logarithm using reduced entropy.

XI. REDUCED BI-DIRECTIONAL BKML4M

As the logarithm BKML4m requires one extra iteration with n=0, this means that the bidirectional method also requires a zero iteration. Pulling this extra iteration out from the logarithm iteration and into the preprocessing stages generates further effects that allow for further savings in complexity and thus cost, as the zeroth iteration is the most non-linear in terms of the tests required for the iteration, so the form of the later iterations may be simplified.

XII. BI-DIRECTIONAL BKML4M DESCRIPTION

The full algorithm required, including the range reduction steps, convergence simplification, reduce entropy table and hoisted zeroth iteration is then described by:

-   -   1. Assuming there are four basic input registers, labelled         (z_(log)),         (z_(log)),         (z_(exp)) and         (z_(exp)), to being with these may contain d at is beyond the         region of convergence of the algorithms described. Therefore, we         range reduce values outside the region of convergence to allow         results for all real values to be found:         -   a. If the process is taking logarithmic input and producing             exponential output, then take the rounded integer part away             from the real logarithm, leaving an             (z_(log)) value in the range [−0.5, +0.5). This integer real             part is to be saved for later as             (z_(integer,log)). Further, take the quadrant number out             from the imaginary part, leaving only the fraction of the             quadrant,             (z_(log)) again in the range [−0.5, +0.5). The quadrant             number may be 0, 1, 2 or 3, but any other upper bits in the             imaginary logarithm are unnecessary and are ignored. The             quadrant number is also saved for later as             (z_(integer,log)).             (z_(exp)) is generally initialized to 1, although any value             may be passed through from the input. Equally, the imaginary             part             (z_(exp)) is generally zero. The initial value of z_(exp)             will be multiplied by the antilog (base             ) of the logarithm registers. Auxiliary registers will also             have the multiplication through by the input antilog (base             ) applied.         -   b. If the process is taking exponential input and producing             logarithmic output, then the sign bits are first considered.             The sign bits can be used to conditionally negate the values             to compute absolute values of both the real and imaginary             parts. By determining which of the real or imaginary part is             larger in absolute value, the value may be moved via an             effective complex multiplication to the quadrant wherein ∥             (z_(exp))∥<             (z_(exp)) and             (z_(exp))>0, while encoding the quadrant move in             (z_(integer,log)). Once completed, since the real part             (z_(exp))>0, the leading zeroes may be counted and the bits             of             (z_(exp)) (and also             (z_(exp))) shifted up into the range such that 0.5≤             (z_(exp))<1, where the number of bit places moved is             recorded in             (z_(integer,log)). The logarithm registers are initialized             with the values in             (z_(integer,log)) and             (z_(integer,log)). Auxiliary registers will have a division             through by the input applied. Preprocess the zeroth             iteration of the logarithm-to-exponentiation process with             the following steps:             -   i. Initialize Boolean constants which describe whether                 the imaginary value is greater in magnitude than the                 smallest valid real part (b₀:=|                 ((z_(exp))|≥0.5), and from there whether it is positive                 (b₊:=                 (z_(exp))≥+0.5) or negative (b⁻:=                 (z_(exp))<−0.5).             -   ii. If b₀ is set, shift                 (z_(exp)) and                 (z_(exp)) right by one bit.

$_{tmp}:=\left\{ {{\begin{matrix} {{{+ s}{{ra}\left( {{\left( z_{\exp} \right)},1} \right)}},{{if}\mspace{14mu} b_{0}\ {is}\ {set}},} \\ {{\left( z_{\exp} \right)},\ {otherwise},} \end{matrix}_{tmp}}:=\left\{ \begin{matrix} {{{+ s}{{ra}\left( {{\left( z_{\exp} \right)},1} \right)}\mspace{14mu} {if}\mspace{14mu} b_{0}\ {is}\ {set}},} \\ {{\left( z_{\exp} \right)}\ ,\ {{otherwise}.}} \end{matrix} \right.} \right.$

-   -   -   -    This will effectively add one to the real part of the                 initial logarithm, making it one if b₀ is set.             -   iii. Compute a shift-and-add depending on the previously                 set Boolean constants:

${\left( z_{\exp} \right)}:={_{tmp} + \left\{ {{\begin{matrix} {{+ _{tmp}},\; {{if}\mspace{14mu} b_{+}\mspace{14mu} {is}\ {set}},} \\ {{- _{tmp}},\ {{if}\ b_{-}\mspace{14mu} {is}\ {set}},} \\ {0,\; {{ot}{herwise}},} \end{matrix}\left( z_{\exp} \right)}:={_{tmp} + \left\{ \begin{matrix} {{+ _{tmp}},\; {{if}\ b_{+ \mspace{14mu}}{is}\ {{se}t}},} \\ {{{- _{{tmp},}}\ {if}\ b_{- \mspace{14mu}}{is}\ {set}},} \\ {0,{{{ot}{herwise}}.}} \end{matrix} \right.}} \right.}$

-   -   -   -    Which therefore rotates by 45° (π/4) while multiplying                 through by the square root of two if b₀ is set.             -   iv. The square root of two change in magnitude from the                 previous step would denote a subtraction of the value of                 a half from the real part of the logarithm, making the                 total change a positive half. The imaginary part is also                 a positive or negative half from the 45° (π/4) rotation.                 This yields changes to the logarithm registers which at                 this point are usually initialized to zero:

${\left( z_{\log} \right)}:={{\left( z_{\log} \right) + \left\{ \begin{matrix} {{{+ 1}/2},{{if}\mspace{14mu} b_{0}\mspace{14mu} {is}\mspace{14mu} {set}},} \\ {0,{otherwise},} \end{matrix} \right.}}$ ${\left( {z,_{\log}} \right)}:={{\left( z_{\log} \right)} + \left\{ \begin{matrix} {{{+ 1}/2},\; {{if}\mspace{14mu} b_{+}\mspace{14mu} {is}\mspace{14mu} {set}},} \\ {{{- 1}/2},{{if}\mspace{14mu} b_{-}\mspace{14mu} {is}\mspace{14mu} {set}},} \\ {0,{{o{therwise}}.}} \end{matrix} \right.}$

-   -   2. Iterate through the values 1, . . . , N−1 as the index n:     -   3. Extract the reduced set of bits on which to conduct the tests         for this iteration:         -   a. If the process is taking logarithmic input and producing             exponential output, then:             -   i. Shift right by N−n and truncate                 (z_(log)) to form                 (z_(test)) such that it has three bits; one sign bit and                 two integer bits in two's complement such that the range                 is [−4.0,+4.0) with the smallest change being 1. The                 multiplication of this value by 2^(−n) is implied by the                 initial shift.             -   ii. Shift right by N−(n+1) and truncate                 (z_(log)) to form                 (z_(test)) such that it has three bits; one sign bit,                 one integer bit and one fraction bit in two's complement                 such that the range is [−2.0,+2.0) with the smallest                 change being 0.5. The multiplication of this value by                 2^(−n) is implied by the initial shift.         -   b. If the process is taking exponential input and producing             logarithmic output, then:             -   i. Apply a subtraction of 1 from the value while testing                 (z_(exp)).

Due to the range reduction enabled by the removal of the zeroth iteration, this simply means any integer bit in

(z_(exp)) is set for the purposes of testing (and therefore always causes the representation of a negative value). For computation purposes therefore:

(z _(tmp,exp)):=

(z _(exp))−1.0,

-   -   -   -    This can be computed in line with the shift right by                 N−(n+1) and truncate                 (z_(exp)) (or                 (z_(tmp,exp))) to form                 (z_(test)) such that it has three bits; one sign bit,                 one integer bit and one fraction bit in two's complement                 such that the range is [−2.0,+2.0) with the smallest                 change being 0.5. The multiplication of this value by                 2^(−n) is implied by the shift.             -   ii. Shift right by N−(n+1) and then truncate                 (z_(exp)) to form                 (z_(test)) such that it has three bits; one sign bit,                 one integer bit and one fraction bits in two's                 complement such that the range is [−2.0,+2.0) with the                 smallest change being 0.5. The multiplication of this                 value by 2^(−n) is implied by the initial shift.

    -   4. Conduct tests on the two 3-bit values         (z_(test)) and         (z_(test)) to determine d_(n). Eliminating any binary point         metainformation—these values are signed integers from here on         having a sign bit and two integer bits—the further operations         may be harmonized, yielding:

:=

(z _(test)≥1,

_(>):=

(z _(test))>−1,

_(>):=

(z _(test))≥+1,

_(>):=

(z _(test))<−1,

-   -    where finally, taking isexp as the Boolean value that denotes a         process that take logarithmic input and produces exponential         output when set:

  ( d n ) := { - 1 ,  i  f      isexp   or    + 1 , i  f    , >    and   isexp   or   , <   and    isexp , 0 ,  otherwise ,    ( d n ) := { - i ,  i  f   , <   and   isexp   or    , >   and    isexp , + i , i  f   , >   and   isexp   or   , <   and    isexp , 0 ,  if   neither .

-   -   5. Apply the shift-and-add process effecting the multiplication         of the 2^(−n) terms to the exponential registers:

${\Re \left( z_{\exp,n} \right)}:={{\Re \left( z_{\exp,{n - 1}} \right)} + \begin{matrix} {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {{- s}{{ra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\Re \left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\Re \left( d_{n} \right)}} = {+ 1}},} \\ {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}{\mspace{11mu} \ }{set}}} \end{matrix},} \right.} \\ {+ \left\{ {\begin{matrix} {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\left( d_{n} \right)}} = {+ i}},} \\ {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}{\mspace{11mu} \ }{set}}} \end{matrix},} \right.} \end{matrix}}$

-   -    And:

${\left( z_{\exp,n} \right)}:={{\left( z_{\exp,{n - 1}} \right)} + \begin{matrix} {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {{- s}{{ra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\Re \left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\Re \left( d_{n} \right)}} = {+ 1}},} \\ {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}{\mspace{11mu} \ }{set}}} \end{matrix},} \right.} \\ {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{+ 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\left( d_{n} \right)}} = {+ i}},} \\ {0,{{if}\mspace{14mu} z_{zero}\mspace{14mu} {is}{\mspace{11mu} \ }{set}}} \end{matrix},} \right.} \end{matrix}}$

-   -    Do the same to any auxiliary registers such as         (z′_(exp,n−1)) and         (z′_(exp,n−1)) to apply the multiplication or division process         to these also.     -   6. Apply the shift-and-add process effecting the multiplication         of the 2^(−2n) term to the exponential registers (in some         implementations, this may be replaced by a second application of         the previous step if the extra serialization can be amortized         into the time cost for the step). As this is the cross-term of a         real and imaginary part, it is guaranteed imaginary, so it has a         more limited set of possible manifestations.         -   If             (d_(n))=−1 and             (d_(n))=+i or             (d_(n))=+1 and             (d_(n))=−i then 2^(−2n)             =−2^(−2n):

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

-   -   -   Whereas if             (d_(n))=+1 and             (d_(n))=+i or             (d_(n))=−1 and             (d_(n))=−i then 2^(−2n)             +2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

-   -   -    wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, n)) and             (z′_(exp, n)) to apply the multiplication or division             process to these also.

    -   7. Subtract the corresponding entry in the logarithm tables from         the registers:

ℜ(z_(log , n)) := ℜ(z_(log , n − 1)) − (log₂1 + 2^(−n)d_(n, ℜ) + log₂1 + 2^(−n)d_(n, )),  = ℜ(z_(log , n − 1)) − ℜ(log_()(1 + 2^(−n)d_(n, ℜ)) + log_()(1 + 2^(−n)d_(n, ))),  = ℜ(z_(log , n − 1)) − (table_(ℜ)[d_(n, ℜ), n] + table_(ℜ)[d_(n, ), n]), (z_(log , n)) := (z_(log , n − 1)) − (2/πarg(1 + 2^(−n)d_(n, ℜ)) + 2/πarg(1 + 2^(−n)d_(n, ))),  = (z_(log , n − 1)) − (log_()(1 + 2^(−n)d_(n, ℜ)) + log_()(1 + 2^(−n)d_(n, ))),  = (z_(log , n − 1)) − (table_()[d_(n, ℜ), n] + table_()[d_(n, ), n]).

-   -    This is achieved using the look-up table constructions         described in the previous section by         and for the imaginary part may be approximated by the low         entropy table method in the previous section.     -   8. Return to step 2 for the next iteration, until N is reached,         at which point the registers will contain the final values for         the fractional portion of the calculation.     -   9. Compute range expansion on the values present in the         registers, so:         -   a. If the process is taking logarithmic input and producing             exponential output, then the quadrant number held in the             integer             (z_(integer,log)) is expanded, rotating back via             multiplication of the exponentiated value z_(exp, N) by the             appropriate value from {1, i, −1, −i}. If the integer part             of the logarithm was not applied, either this may be applied             as a bit shift, or kept as an exponent, allowing the process             to emit a floating-point value.         -   b. If the process is taking exponential input and producing             logarithmic output, then if the integer part of the             logarithm described by the leading zeroes count of the first             step has not yet been applied, add this value.

XIII. THE BKML3DM VARIANT

A new solution was derived by choosing d_(n) from the set of four possible values:

${d_{n} \in \begin{Bmatrix} {{{- 1} - i + {2^{- n}i}},} \\ {{{- 1} + i - {2^{- n}i}},} \\ {{{+ 1} + i + {2^{- n}i}},} \\ {{{+ 1} - i - {2^{- n}i}},} \end{Bmatrix}},$

requiring only three logarithm lookup tables to obtain the logarithms (base

) for each of the four values. This results in not only fewer lookup tables but has a further side effect of reducing further the complexity of the tests required and the dependency chains for each iteration. As each relies on fewer bits for the result, they may be computed more efficiently, or multiple steps may be calculated within each clock cycle.

A drawback of this approach is that some iterations (with a seemingly functional heuristic wherein those numbered with Fibonacci numbers must be processed twice) must be repeated to achieve convergence. As the repeated iterations share the same lookup tables, it is likely these may be computed in the same step without expanding the dependencies significantly.

This approach leads to a binary choice of modifier for each real value and imaginary value at each step. Intuitively, this must be more closely approaching an optimal solution to the overall problem.

With the proposed changes, the size of the lookup tables is reduced to N discrete groups of 3N bits, with 3N² bits overall.

XIV. LOOK-UP TABLE CONSTRUCTION

When considering the logarithm register (z_(log)) portion of the exponentiation and logarithm iterations, it can be shown that only three lookup tables need be constructed to contain the bit patterns of the logarithms required. These are:

${l_{n,{\Re +}} = {{\log_{2}{{1 + 2^{- n}}}} + {\log_{2}{{1 \pm {2^{- n}i}}}}}},{l_{n,{\Re -}} = {{\log_{2}{{1 - 2^{- n}}}} + {\log_{2}{{1 \pm {2^{- n}i}}}}}},{l_{n,} = {\frac{2}{\pi}{\tan^{- 1}\left( 2^{- n} \right)}}},$

Then the logarithms to use for the addition/subtraction portion will be for each possible d_(n)∈{−1−i+2^(−n)i,−1+i−2^(−n)i,+1+i+2^(−n)i,+1−i−2^(−n)i}:

((−2^(−n))(1−2^(−n) i))=+

−

((−2^(−n))(1+2^(−n) i))=+

+

((+2^(−n))(1+2^(−n) i))=+

+

((+2^(−n))(1−2^(−n) i))=+

−

These are then subtracted from the running total of the logarithm. In each case, the decision of the d_(n) to use is based on the sign bit of the logarithm or the exponential with 1.0 subtracted to co-locate the origin of both logarithm-to-exponential and exponential-to-logarithm iterations. It is anticipated that using an estimation scheme may allow high-radix iterations to slice the domain into parallelized operations allowing for lower latency implementations.

XV. BKML3DM: EXPONENTIATION MODE ITERATION

Assuming the fractional part of the input logarithms to be the input, the algorithm for this method for the domain of convergence z_(input)∈R=[−0.5,+0.5)+i[−0.5, +0.5) can be written for exponentiation as:

-   -   1. Assuming there are four basic registers, labelled         *z_(log)),         (z_(log)),         (z_(exp)) and         (z_(exp)). Alongside, there are two extra slave multiplication         registers         (z_(exp)) and         (z_(exp)) to demonstrate how the method operates when used for         auxiliary complex multiplication. The initial values of these         registers are:

(z _(log)):=

(z _(input)),

(z _(log)):=

(z _(input)),

(z _(exp)):=

(z _(integer input, output) ×z _(premultiply)),

(z _(exp)):=

(z _(integer input, output) ×z _(premultiply)),

-   -    where z_(premultiply):=1.0, if there are no requirements for         pre-multiplication. The slave multiplication registers may also         be similarly constructed with:

(z′ _(exp)):=

(z _(integer input, output) ×z′ _(premultiply)),

(z′ _(exp)):=

(z _(integer input, output) ×z′ _(premultiply)).

-   -   2. Iterate through the values 1, . . . , N as the index n, but         repeating elements part of the Fibonacci sequence. These first         few n would therefore be:         -   n=1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 9, . . .     -   3. Test the sign bits of         (z_(log,n−1)) and         (z_(log,n−1)) to determine d_(n):

${\Re \left( d_{n} \right)}:=\left\{ {\begin{matrix} {{- 1},{{{if}\mspace{14mu} {\Re \left( z_{\log,{n - 1}} \right)}} < 0},} \\ {{+ 1},{{{if}\mspace{14mu} {\Re \left( z_{\log,{n - 1}} \right)}} \geq 0}} \end{matrix},{{\left( d_{n} \right)}:=\left\{ {\begin{matrix} {{- i},\ {{{if}\mspace{14mu} {\left( z_{\log,{n - 1}} \right)}} < 0},} \\ {{+ i},\ {{{if}\mspace{14mu} {\left( z_{\log,{n - 1}} \right)}} \geq 0}} \end{matrix},} \right.}} \right.$

-   -   4. Apply the shift-and-add process effecting the multiplication         of the 2^(−n) terms to the exponential registers:

${\Re \left( z_{\exp,n} \right)}:={{\Re \left( z_{\exp,{n - 1}} \right)} + \begin{matrix} {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {{- s}{{ra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\Re \left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\Re \left( d_{n} \right)}} = {+ 1}}} \end{matrix},} \right.} \\ {+ \left\{ {\begin{matrix} {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\left( d_{n} \right)}} = {+ i}}} \end{matrix},} \right.} \end{matrix}}$

-   -    And:

${\left( z_{\exp,n} \right)}:={{\left( z_{\exp,{n - 1}} \right)} + \begin{matrix} {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {{- s}{{ra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\Re \left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\Re \left( d_{n} \right)}} = {+ 1}}} \end{matrix},} \right.} \\ {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{+ 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\left( d_{n} \right)}} = {+ i}}} \end{matrix},} \right.} \end{matrix}}$

-   -   -   Do the same to any auxiliary registers such as             (z′_(exp,n−1)) and             (z′_(exp,n−1)) to apply the multiplication process to these             also.

    -   5. Apply the shift-and-add process effecting the multiplication         of the 2^(−2n) term to the exponential registers. As this is the         cross-term of a real and imaginary part, it is guaranteed         imaginary, so it has a more limited set of possible         manifestations.         -   If             (d_(n))=−1 and             (d_(n))=+i or             (d_(n))=+1 and             (d_(n))=−i then 2^(−2n)             =−2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

-   -   -   Whereas if             (d_(n))=+1 and             (d_(n))=+i or             (d_(n))=−1 and             (d_(n))=−i then 2^(−2n)             =+2 ^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

-   -   -    wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, n)) and             (z′_(exp, n)) to apply the multiplication process to these             also.

    -   6. Subtract the corresponding entry in the logarithm tables from         the registers:

ℜ(z_(log , n)) := ℜ(z_(log , n − 1)) − (log₂1 + 2^(−n)d_(n, ℜ) + log₂1 + 2^(−n)d_(n, )),  = ℜ(z_(log , n − 1)) − ℜ(log_()(1 + 2^(−n)d_(n, ℜ)) + log_()(1 + 2^(−n)d_(n, ))),  = ℜ(z_(log , n − 1)) − (table_(ℜ)[d_(n, ℜ), n] + table_(ℜ)[d_(n, ), n]), (z_(log , n)) := (z_(log , n − 1)) − (2/πarg(1 + 2^(−n)d_(n, ℜ)) + 2/πarg(1 + 2^(−n)d_(n, ))),  = (z_(log , n − 1)) − (log_()(1 + 2^(−n)d_(n, ℜ)) + log_()(1 + 2^(−n)d_(n, ))),  = (z_(log , n − 1)) − (table_()[d_(n, ℜ), n] + table_()[d_(n, ), n]).

-   -   -   This is achieved using the look-up table constructions             described in the previous section by             .

    -   7. Return to step 2 for the next iteration, until N is reached,         at which point the registers will contain the final values for         the fractional portion of the calculation:

(z _(exp, N)):=

(z _(integer input, output) ×z _(premultiply)×

(e ^(π/2))

),

(z _(exp, N)):=

(z _(integer input, output) ×z _(premultiply)×

(e ^(π/2))

),

-   -    And:

(z _(exp, N)):=

(z _(integer input, output) ×z _(premultiply)×

(e ^(π/2))

),

(z _(exp, N)):=

(z _(integer input, output) ×z _(premultiply)×

(e ^(π/2))

),

Having appreciated the form of the process, it is easy to find other testing procedures that are convergent, although we have endeavored to reduce complexity by specifying the required domain region tests in the simplest known form.

An illustration of the application of this procedure to values z_(input)∈R=[−2.0,+2.0)+i[−2.0,+2.0) is shown in FIGS. 3A and 3B.

FIGS. 3A and 3B show illustrations of errors in the complex plane in the logarithm-to-exponential process (floating-point implementation) for the BKML3dm iteration prior to the inclusion of the reduced entropy tables. These figures correspond to illustrative tests of the iterative scheme in floating-point and with no range reduction steps to demonstrate the mathematical viability of the dynamical system rather than being a faithful reproduction of the iterative procedures outlined.

In FIG. 3A, shown is a simulation 900A where the x-axis 920A is real, and the y-axis 910A is imaginary in the input to the algorithm. Shading denotes the error (where a black shading 930A implies the error is linearly related to the bits and iterations of the algorithm).

In FIG. 3B, shown is a simulation 900B where the x-axis 920B is real, and the y-axis 910B is imaginary in the input to the algorithm. The white square 930B is constructed by inverting the color and denotes the portion of the domain (z_“input” “∈R”=[−0.5┤, ├−+0.5)+i[−0.5┤, ├+0.5)) which is required to be convergent. Therefore, if the algorithm functions in this zone, it is expected for the region to be shaded solid white.

XVI. BKML3DM: LOGARITHM MODE ITERATION

Assuming the fractional part of the output logarithms to be the output, the algorithm for the domain of convergence z_(input)∈R=[+0.5,+1.0)+i[−

(R),+

(R)) is:

-   -   1. Assuming there are four basic registers, labelled         (z_(log)),         (z_(log)),         (z_(exp)) and         (z_(exp)). Alongside, there are two extra slave division         registers         (z_(exp)) and         (z_(exp)) to demonstrate how the method operates when used for         auxiliary complex division. The initial values of these         registers are:

(z _(log)):=

(z _(integer output, output)),

(z _(log)):=

(z _(integer output, output)),

(z _(exp)):=

(z _(input)),

(z _(exp)):=

(z _(input)),

-   -   -   The slave division registers may also be similarly             constructed with:

(z′ _(exp)):=

(z′ _(numerator) ÷z _(integer output, input)),

(z′ _(exp)):=

(z′ _(numerator) ÷z _(integer output, input)),

-   -   2. Iterate through the values 1, . . . , N as the index n, but         repeating elements part of the Fibonacci sequence. These first         few n would therefore be:         -   n=1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 9, . . .     -   3. Test the sign bits of         (z_(exp,n−1))−1 (where the −1 is computed by permuting the top         two bits of the register) and         (z_(exp,n−1)) to determine d_(n):

${\Re \left( d_{n} \right)}:=\left\{ {\begin{matrix} {{+ 1},{{{if}\mspace{11mu} \left( \; {{\Re \left( z_{\exp,{n - 1}} \right)} - 1} \right)} < 0},} \\ {{- 1},{{{if}\mspace{11mu} \left( \; {{\Re \left( z_{\exp,{n - 1}} \right)} - 1} \right)} \geq 0}} \end{matrix},{{\left( {d_{n}.} \right)}:=\left\{ {\begin{matrix} {{+ i},\ {{{if}\mspace{14mu} {\left( z_{\exp,{n - 1}} \right)}} < 0},} \\ {{- i},\ {{{if}\mspace{14mu} {\left( z_{\exp,{n - 1}} \right)}} \geq 0}} \end{matrix},} \right.}} \right.$

-   -   4. Apply the shift-and-add process effecting the multiplication         of the 2^(−n) terms to the exponential registers:

${\Re \left( z_{\exp,n} \right)}:={{\Re \left( z_{\exp,{n - 1}} \right)} + \begin{matrix} {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {{- s}{{ra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\Re \left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\Re \left( d_{n} \right)}} = {+ 1}}} \end{matrix},} \right.} \\ {+ \left\{ {\begin{matrix} {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\left( d_{n} \right)}} = {+ i}}} \end{matrix},} \right.} \end{matrix}}$

-   -    And:

${\left( z_{\exp,n} \right)}:={{\left( z_{\exp,{n - 1}} \right)} + \begin{matrix} {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {{- s}{{ra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\Re \left( d_{n} \right)}} = {- 1}},} \\ {{{{+ 2^{- n}}{\left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\Re \left( d_{n} \right)}} = {+ 1}}} \end{matrix},} \right.} \\ {+ \left\{ {\begin{matrix} {{{{- 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {- {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\;,{{{if}\mspace{14mu} {\left( d_{n} \right)}} = {- i}},} \\ {{{{+ 2^{- n}}{\Re \left( z_{\exp,{n - 1}} \right)}} = {+ {{sra}\left( {{\Re \left( z_{\exp,{n - 1}} \right)},n} \right)}}}\ ,{{{if}{\mspace{11mu} \ }{\left( d_{n} \right)}} = {+ i}}} \end{matrix},} \right.} \end{matrix}}$

-   -   -   Do the same to any auxiliary registers such as             (z′_(exp,n−1)) and             (z′_(exp,n−1)) to apply the multiplication process to these             also.

    -   5. Apply the shift-and-add process effecting the multiplication         of the 2^(−2n) term to the exponential registers. As this is the         cross-term of a real and imaginary part, it is guaranteed         imaginary, so it has a more limited set of possible         manifestations.         -   If             (d_(n))=−1 and             (d_(n))=+i or             (d_(n))=+1 and             (d_(n))=−i then 2^(−2n)             =−2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

-   -   -   Whereas if             (d_(n))=+1 and             (d_(n))=+i or             (d_(n))=−1 and             (d_(n))=−i then 2^(−2n)             =+2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

-   -   -    wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, n)) and             (z′_(exp, n)) to apply the multiplication process to these             also.

    -   6. Subtract the corresponding entry in the logarithm tables from         the registers:

ℜ(z_(log , n)) := ℜ(z_(log , n − 1)) − (log₂1 + 2^(−n)d_(n, ℜ) + log₂1 + 2^(−n)d_(n, )),  = ℜ(z_(log , n − 1)) − ℜ(log_()(1 + 2^(−n)d_(n, ℜ)) + log_()(1 + 2^(−n)d_(n, ))),  = ℜ(z_(log , n − 1)) − (table_(ℜ)[d_(n, ℜ), n] + table_(ℜ)[d_(n, ), n]), (z_(log , n)) := (z_(log , n − 1)) − (2/πarg(1 + 2^(−n)d_(n, ℜ)) + 2/πarg(1 + 2^(−n)d_(n, ))),  = (z_(log , n − 1)) − (log_()(1 + 2^(−n)d_(n, ℜ)) + log_()(1 + 2^(−n)d_(n, ))),  = (z_(log , n − 1)) − (table_()[d_(n, ℜ), n] + table_()[d_(n, ), n]).

-   -   -   This is achieved using the look-up table constructions             described in the previous section by             .

    -   7. Return to step 2 for the next iteration, until N is reached,         at which point the registers will contain their final values:

(z _(log, N)):=log₂∥

(z _(input))+i

(z _(input))∥,

(z _(log, N)):=2/π arg(

(z _(input))+i

(z _(input))),

-   -    And:

(z′ _(exp, N)):=

(z′ _(numerator)÷(z _(integer output, input) ×z _(input))),

(z′ _(exp, N)):=

(z′ _(numerator)÷(z _(integer output, input) ×z _(input))),

Having appreciated the form of the process, it is possible to find other testing procedures that are convergent, even sometimes in the required domain, by forming

(z_(exp, test)),

(z_(exp, test)) or both using different number of bits or different comparison values, although we have endeavored to reduce complexity by specifying the required value tests in the simplest known form.

An illustration of the application of this procedure to values z_(input)∈R=[−2.0,+2.0)+i[−2.0,+2.0) is shown in FIGS. 4A and 4B.

FIGS. 4A and 4B show illustration of errors in the complex plane in the exponential-to-logarithm process (floating-point implementation) for the BKML3dm prior to the inclusion of the reduced entropy tables. These figures correspond to illustrative tests of the iterative scheme in floating-point and with no range reduction steps to demonstrate the mathematical viability of the dynamical system rather than being a faithful reproduction of the iterative procedures outlined.

In FIG. 4A, shown is a simulation 1000A where the x-axis 1020A is real, and the y-axis 1010A is imaginary in the input to the algorithm. Shading denotes the error (where a black shading 1030A implies the error is linear related to the bits and iterations of the algorithm).

In FIG. 4B, shown is a simulation 1000B where the x-axis 1020B is real, and the y-axis 1010B is imaginary in the input to the algorithm. The white trapezoid 1030B is constructed by inverting the color and denotes the portion of the domain (z_“input” “∈R”=[+0.5┤, ├+1.0)+i[−R(R)┤, ├+R(R))) which is required to be convergent. Therefore, if the algorithm functions in this zone, it is expected for the region to be shaded solid white. Branch cut artifacts have been compensated for on the real line.

XVII. BKML3DM: UNIFIED LOGARITHM-TO-EXPONENTIAL AND EXPONENTIAL-TO-LOGARITHM ALGORITHM

With only three lookup tables and four possible values of d_(n) for both directions of the algorithm, merging these in a bi-directional algorithm can be achieved. The steps are:

-   -   1. Assuming there are four basic input registers, labelled         (z_(log)),         (z_(log)),         (z_(exp)) and         (z_(exp)), to being with these may contain data that is beyond         the region of convergence of the algorithms described.         Therefore, we range reduce values outside the region of         convergence to allow results for all real values to be found:         -   a. If the process is taking logarithmic input and producing             exponential output, then take the rounded integer part away             from the real logarithm, leaving an             (z_(log)) value in the range [−0.5, +0.5). This integer real             part is to be saved for later as             (z_(integer,log)). Further, take the quadrant number out             from the imaginary part, leaving only the fraction of the             quadrant,             (z_(log)) again in the range [−0.5, +0.5). The quadrant             number may be 0, 1, 2 or 3, but any other upper bits in the             imaginary logarithm are unnecessary and are ignored. The             quadrant number is also saved for later as             (z_(integer,log)).             (z_(exp)) is generally initialized to 1, although any value             may be passed through from the input. Equally, the imaginary             part             (z_(exp)) is generally zero. The initial value of z_(exp)             will be multiplied by the antilog (base             ) of the logarithm registers. Auxiliary registers will also             have the multiplication through by the input antilog (base             ) applied.         -   b. If the process is taking exponential input and producing             logarithmic output, then the sign bits are first considered.             The sign bits can be used to conditionally negate the values             to compute absolute values of both the real and imaginary             parts. By determining which of the real or imaginary part is             larger in absolute value, the value may be moved via an             effective complex multiplication to the quadrant wherein ∥             (z_(exp))∥<             (z_(exp)) and             (z_(exp))>0, while encoding the quadrant move in             (z_(integer,log)). Once completed, since the real part             (z_(exp))>0, the leading zeroes may be counted and the bits             of             (z_(exp)) (and also             (z_(exp))) shifted up into the range such that 0.5≤             (z_(exp))<1, where the number of bit places moved is             recorded in             (z_(integer,log)). The logarithm registers are initialized             with the values in             (z_(integer,log)) and             (z_(integer,log)). Auxiliary registers will have a division             through by the input applied.     -   2. Iterate through the values 1, . . . , N as the index n, but         repeating elements part of the Fibonacci sequence. These first         few n would therefore be:         -   n=1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 9, . . .     -   3. Test the sign bits of the appropriate registers to determine         d_(n). As the sign bits are themselves the set of Boolean tests,         this set of tests can almost be elided by taking the exclusive         OR of the sign bit with a Boolean digit true when logarithmic         output is intended:         -   a. If the process is taking logarithmic input and producing             exponential output, then test the sign bits of             (z_(log,n−1)) and             (z_(log,n−1)):

${\Re \left( d_{n} \right)}:=\left\{ {\begin{matrix} {{- 1},{{{if}\mspace{14mu} {\Re \left( z_{\log,{n - 1}} \right)}} < 0},} \\ {{+ 1},{{{if}\mspace{14mu} {\Re \left( z_{\log,{n - 1}} \right)}} \geq 0}} \end{matrix},{{\left( {d_{n}.} \right)}:=\left\{ {\begin{matrix} {{- i},\ {{{if}\mspace{14mu} {\left( z_{\log,{n - 1}} \right)}} < 0},} \\ {{+ i},\ {{{if}\mspace{14mu} {\left( z_{\log,{n - 1}} \right)}} \geq 0}} \end{matrix},} \right.}} \right.$

-   -   -   So, the computation is:

:=

:=

-   -   -   b. If the process is taking exponential input and producing             logarithmic output, then test the sign bits of             (z_(exp,n−1))−1 (where the −1 is computed by permuting the             top two bits of the register) and             (z_(exp,n−1)) to determine d_(n):

${\Re \left( d_{n} \right)}:=\left\{ {\begin{matrix} {{+ 1},{{{if}\mspace{14mu} \left( {{\Re \left( z_{\exp,{n - 1}} \right)} - 1} \right)} < 0},} \\ {{- 1},{{{if}\mspace{11mu} \left( \; {{\Re \left( z_{\exp,{n - 1}} \right)} - 1} \right)} \geq 0}} \end{matrix},{{\left( {d_{n}.} \right)}:=\left\{ {\begin{matrix} {{+ i},\ {{{if}\mspace{14mu} {\left( z_{\exp,{n - 1}} \right)}} < 0},} \\ {{- i},\ {{{if}\mspace{14mu} {\left( z_{\exp,{n - 1}} \right)}} \geq 0}} \end{matrix},} \right.}} \right.$

-   -   -   So, the computation is:

:=

:=

-   -   4. Apply the shift-and-add process effecting the multiplication         of the 2^(−n) terms to the exponential registers:

 ( z exp , n ) :=  ( z exp , n - 1 ) + + { - 2 - n   ( z exp , n - 1 ) = - sra  (  ( z exp , n - 1 ) , n ) , if   ( d n ) ,  + 2 - n   ( z exp , n - 1 ) = + sra  (  ( z exp , n - 1 ) , n ) , if    ( d n ) , + { + 2 - n   ( z exp , n - 1 ) = + sra  (  ( z exp , n - 1 ) , n ) , if   ( d n ) , - 2 - n   ( z exp , n - 1 ) = - sra  (  ( z exp , n - 1 ) , n ) , if    ( d n ) ,

-   -    And:

 ( z exp , n ) :=  ( z exp , n - 1 ) + + { - 2 - n   ( z exp , n - 1 ) = - sra  (  ( z exp , n - 1 ) , n ) , if   ( d n ) ,  + 2 - n   ( z exp , n - 1 ) = + sra  (  ( z exp , n - 1 ) , n ) , if    ( d n ) , + { + 2 - n   ( z exp , n - 1 ) = - sra  (  ( z exp , n - 1 ) , n ) , if   ( d n ) , - 2 - n   ( z exp , n - 1 ) = + sra  (  ( z exp , n - 1 ) , n ) , if     ( d n ) ,

-   -   -   Do the same to any auxiliary registers such as             (z′_(exp,n−1)) and             (z′_(exp,n−1)) to apply the multiplication or division             process to these also.

    -   5. Apply the shift-and-add process effecting the multiplication         of the 2^(−2n) term to the exponential registers. As this is the         cross-term of a real and imaginary part, it is guaranteed         imaginary, so it has a more limited set of possible         manifestations.         -   Wherein XOR is the logical binary operator of exclusive-or,             if             XOR             then 2^(−2n)             =−2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

-   -   -   Whereas if ¬(             XOR             ) then 2^(−2n)             =+2^(−2n)i:

(z _(exp, n)):=

(z _(exp, n))−sra(

(z _(exp, n−1)),2n),

(z _(exp, n)):=

(z _(exp, n))+sra(

(z _(exp, n−1)),2n),

-   -   -    wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, n)) and             (z′_(exp, n)) to apply the multiplication or division             process to these also.

    -   6. Subtract the corresponding entries in the logarithm tables         from the registers:

 ( z log , n ) :=  ( z log , n - 1 ) - + { log 2  ( ( 1 - 2 - n )  1 + 2 - 2  n ) , if   ( d n ) , log 2  ( ( 1 + 2 - n )  1 + 2 - 2  n ) , if     ( d n ) ,    ( z log , n ) :=  ( z log , n - 1 ) - + { - 2 π  tan - 1  2 - n , if   ( d n ) , + 2 π  tan - 1  2 - n , if     ( d n ) ,

-   -   7. Return to step 2 for the next iteration, until N is reached,         at which point the registers will contain the final values for         the fractional portion of the calculation.     -   8. Compute range expansion on the values present in the         registers, so:         -   a. If the process is taking logarithmic input and producing             exponential output, then the quadrant number held in the             integer             (z_(integer,log)) is expanded, rotating back via             multiplication of the exponentiated value z_(exp, N) by the             appropriate value from {1, i, −1, −i}. If the integer part             of the logarithm was not applied, either this may be applied             as a bit shift, or kept as an exponent, allowing the process             to emit a floating-point value.         -   b. If the process is taking exponential input and producing             logarithmic output, then if the integer part of the             logarithm described by the leading zeroes count of the first             step has not yet been applied, add this value.

XVIII. BKML3DM: HIGH RADIX IMPLEMENTATIONS, WITH 8-RADIX LOGARITHM-TO-EXPONENTIAL EXAMPLE

The use of sign bits to drive the possible choices of d_(n) allows the design to scale with radix, so iterations can be conceived which produce multiple bits of result per iteration. This is because the radix-2 has few serial operations, as described in the table:

Radix 2 4 8 16 32 64 128 Real condition input (bits) 1  4*  6  7*   8*   9*   10* Imaginary condition input (bits) 1  3*  7  8*   9*  10*   11* Real condition output (bits) 1  2  3  4   5   6   7 Imaginary condition output (bits) 1  2  3  4   5   6   7 Parallelizable additions (logarithm terms) 1  2  3  4   5   6   7 Fully serial shift and add (serial terms) 1  2  3  4   5   6   7 Fully serial shift and add (parallel terms) 3  3  3  3   3   3   3 Fully parallel shift and add (serial terms) 1  1  1  1   1   1   1 Fully parallel shift and add (parallel terms) 3 15 63 255 1023 4095 16385 where * denote estimated values. This suggests that the conditional decision-making portion of an iteration of a radix-16 implementation may be implemented as a 9-bit input, 4-bit output multiplexer or lookup table (LUT) for the real part and an 8-bit input, 4-bit output multiplexer or lookup table (LUT) for the imaginary part. These conditional decision lookup tables are fixed for a given iteration in each direction (logarithm-to-exponential or exponential-to-logarithm) but may for optimality differ between iterations.

Further, it should be noted that a radix-16 implementation of the multiply in the exponentiation part of the iteration may have 1 serial shift-and-add section, which involves 255 parallel additions, or 2 serial shift-and-add sections which each involve the parallel addition of 15 partial terms or 4 serial shift-and-add sections which each involve 3 parallel additions of shifted terms. Each can trade off calculation dependencies for quickly growing sets of terms.

A radix-8 implementation of logarithm-to-exponential (chosen because the conditional decision lookup tables required are linear, so can be written for the general case if radix-4 behavior is acceptable due to the limitations of the extra iterations required which can be otherwise mostly overcome) for example may be described by:

-   -   1. Assuming there are four basic registers, labelled         (z_(log)),         (z_(log)),         (z_(exp)) and         (z_(exp)). Alongside, there are two extra slave multiplication         registers         (z_(exp)) and         (z_(exp)) to demonstrate how the method operates when used for         auxiliary complex multiplication. The initial values of these         registers are:

(z _(log)):=

(z _(input)),

(z _(log)):=

(z _(input)),

(z _(log)):=

(z _(integer input, output) ×z _(premultiply)),

(z _(log)):=

(z _(integer input, output) ×z _(premultiply)),

-   -    where z_(premultiply):=1.0, if there are no requirements for         pre-multiplication. The slave multiplication registers may also         be similarly constructed with:

(z′ _(exp)):=

(z _(integer input, output) ×z′ _(premultiply)),

(z′ _(exp)):=

(z _(integer input, output) ×z′ _(premultiply)),

-   -   2. Iterate through the values 1, . . . , N as the index n, but         actually use triplets of consecutive bit shift numbers:         -   [S_(n,1), S_(n,2), S_(n,3)]∈{[1, 2, 3], [3, 4, 5], [5, 6,             7], [7, 8, 9], [9, 10, 11], [11, 12, 13], . . . },     -   3. Extract the reduced set of bits on which to conduct the tests         for this logarithm-to-exponential iteration. This is the upper         8-bits of the real part and the upper 7-bits of the imaginary         part:         -   a. Shift right by N−(S_(n,1)+3) and truncate             (z_(log)) to form             (z_(test)) such that it has six bits; one sign bit, two             integer bits and three fraction bits in two's complement             such that the range is [−4.0,+4.0) with the smallest change             being 0.125. The multiplication of this value by 2^(−S)             ^(n,1) is implied by the initial shift.         -   b. Shift right by N−(S_(n,1)+4) and truncate             (z_(log)) to form             (z_(test)) such that it has seven bits; one sign bit, two             integer bit and five fraction bits in two's complement such             that the range is [−4.0,+4.0) with the smallest change being             0.0625. The multiplication of this value by 2^(−S) ^(n,1) is             implied by the initial shift.     -   4. Conduct tests on the two values         (z_(test)) and         (z_(test)) to determine d_(n). In a production implementation of         a uni- or bi-directional algorithm in either direction this may         be brute forced to generated the least total error at the end of         the iteration. However, for the logarithm-to-exponential         iteration, the process appears largely linear, so a consistent         choice can be made on that basis, yielding:         -   a. Real part test value:

t  e  s  t := { 7 , if    ( z test ) < - 18 , 6 , if - 18 ≤  ( z test ) < - 12 , 5 , if - 12 ≤  ( z test ) < - 6 , 4 , if - 6 ≤  ( z test ) < 0 , 3 , if   0 ≤  ( z test ) < + 6 , 2 , if + 6 ≤  ( z test ) < + 12 , 1 , if + 12 ≤  ( z test ) < + 18 , 0 , if + 18 ≤  ( z test )  ,

-   -   -   b. Imaginary part test value:

test := { 7 , if    ( z test ) < - 15 , 6 , if - 15 ≤  ( z test ) < - 10 , 5 , if - 10 ≤  ( z test ) < - 5 , 4 , if - 5 ≤  ( z test ) < 0 , 3 , if   0 ≤  ( z test ) < + 5 , 2 , if + 5 ≤  ( z test ) < + 10 , 1 , if + 10 ≤  ( z test ) < + 15 , 0 , if + 15 ≤  ( z test )  ,

-   -   5. Apply the shift-and-add process effecting the multiplication         of the 2^(−S) ^(n,1) terms to the exponential registers:

 ( z exp , S n , 1 ) :=  ( z exp ) + + { - 2 - S n , 1   ( z exp ) = - sra  (  ( z exp ) , S n , 1 ) , if     4 ,  + 2 - S n , 1   ( z exp ) = + sra  (  ( z exp ) , S n , 1 ) , if    ( test  4 ) , + { + 2 - S n , 1   ( z exp ) = + sra  (  ( z exp ) , S n , 1 ) , if   test  4 , - 2 - S n , 1   ( z exp ) = - sra  (  ( z exp ) , S n , 1 ) , if    ( test  4 ) ,

-   -    And:

 ( z exp , S n , 1 ) :=  ( z exp ) + + { - 2 - S n , 1   ( z exp ) = - sra  (  ( z exp ) , S n , 1 ) , if     4 ,  + 2 - S n , 1   ( z exp ) = + sra  (  ( z exp ) , S n , 1 ) , if    (   4 ) , + { - 2 - S n , 1   ( z exp ) = - sra  (  ( z exp ) , S n , 1 ) , if   test  4 , + 2 - S n , 1   ( z exp ) = + sra  (  ( z exp ) , S n , 1 ) , if    ( test  4 ) ,

-   -   -   Do the same to any auxiliary registers such as             (z′_(exp)) and             (z′_(exp)) to apply the multiplication process to these             also, producing             (z′_(exp, S) _(n,1) ) and             (z′_(exp, S) _(n,1) ).

    -   6. Apply the shift-and-add process effecting the multiplication         of the 2^(−2S) ^(n,1) term to the exponential registers. As this         is the cross-term of a real and imaginary part, it is guaranteed         imaginary, so it has a more limited set of possible         manifestations.         -   Wherein XOR is the logical binary operator of exclusive-or,             if (             {circumflex over ( )}4) XOR (             {circumflex over ( )}4) then 2^(−2S) ^(n,1)             =−2^(−2S) ^(n,1) i:

(z _(exp)):=

(z _(exp, S) _(n,1) )+sra(

(z _(exp, S) _(n,1) ),2S _(n,1)),

(z _(exp)):=

(z _(exp, S) _(n,1) )−sra(

(z _(exp, S) _(n,1) ),2S _(n,1)),

-   -   -   Whereas if ¬((test             {circumflex over ( )}4) XOR (test             {circumflex over ( )}4)) then 2^(−2S) ^(n,1)             =+2^(−2S) ^(n,1) i:

(z _(exp)):=

(z _(exp, S) _(n,1) )−sra(

(z _(exp, S) _(n,1) ),2S _(n,1)),

(z _(exp)):=

(z _(exp, S) _(n,1) )+sra(

(z _(exp, S) _(n,1) ),2S _(n,1)),

-   -   -    wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, S) _(n,1) ) and             (z′_(exp, S) _(n,1) ) to apply the multiplication or             division process to these also, producing             (z′_(exp)) and             (z′_(exp)).

    -   7. Apply the shift-and-add process effecting the multiplication         of the 2^(−S) ^(n,2) terms to the exponential registers:

 ( z exp , S n , 2 ) :=  ( z exp ) + + { - 2 - S n , 2   ( z exp ) = - sra  (  ( z exp ) , S n , 2 ) , if     2 ,  + 2 - S n , 2   ( z exp ) = + sra  (  ( z exp ) , S n , 2 ) , if    ( test  2 ) , + { + 2 - S n , 2   ( z exp ) = + sra  (  ( z exp ) , S n , 2 ) , if   test  2 , - 2 - S n , 2   ( z exp ) = - sra  (  ( z exp ) , S n , 2 ) , if    ( test  2 ) ,

-   -    And:

 ( z exp , S n , 2 ) :=  ( z exp ) + + { - 2 - S n , 2   ( z exp ) = - sra  (  ( z exp ) , S n , 2 ) , if     2 ,  + 2 - S n , 2   ( z exp ) = + sra  (  ( z exp ) , S n , 2 ) , if    (   2 ) , + { - 2 - S n , 2   ( z exp ) = - sra  (  ( z exp ) , S n , 2 ) , if   test  2 , + 2 - S n , 2   ( z exp ) = + sra  (  ( z exp ) , S n , 2 ) , if    ( test  2 ) ,

-   -   -   Do the same to any auxiliary registers such as             (z′_(exp)) and             (z′_(exp)) to apply the multiplication process to these             also, producing             (z′_(exp, S) _(n,2) ) and             (z′_(exp, S) _(n,2) ).

    -   8. Apply the shift-and-add process effecting the multiplication         of the 2^(−2S) ^(n,2) term to the exponential registers. As this         is the cross-term of a real and imaginary part, it is guaranteed         imaginary, so it has a more limited set of possible         manifestations.         -   Wherein XOR is the logical binary operator of exclusive-or,             if (             {circumflex over ( )}2) XOR (             {circumflex over ( )}2) then 2^(−2S) ^(n,2)             =−2^(−2S) ^(n,2) i:

(z _(exp)):=

(z _(exp, S) _(n,2) )+sra(

(z _(exp, S) _(n,2) ),2S _(n,2)),

(z _(exp)):=

(z _(exp, S) _(n,2) )−sra(

(z _(exp, S) _(n,2) ),2S _(n,2)),

-   -   -   Whereas if ¬((             {circumflex over ( )}2) XOR (             {circumflex over ( )}2)) then 2^(−2S) ^(n,2)             =+2^(−2S) ^(n,2) i:

(z _(exp)):=

(z _(exp, S) _(n,2) )−sra(

(z _(exp, S) _(n,2) ),2S _(n,2)),

(z _(exp)):=

(z _(exp, S) _(n,2) )+sra(

(z _(exp, S) _(n,2) ),2S _(n,2)),

-   -   -    wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, S) _(n,2) ) and             (z′_(exp, S) _(n,2) ) to apply the multiplication or             division process to these also, producing             (z′_(exp)) and             (z′_(exp)).

    -   9. Apply the shift-and-add process effecting the multiplication         of the 2^(−S) ^(n,3) terms to the exponential registers:

 ( z exp , S n , 3 ) :=  ( z exp ) + + { - 2 - S n , 3   ( z exp ) = - sra  (  ( z exp ) , S n , 3 ) , if     1 ,  + 2 - S n , 3   ( z exp ) = + sra  (  ( z exp ) , S n , 3 ) , if    ( test  1 ) , + { + 2 - S n , 3   ( z exp ) = + sra  (  ( z exp ) , S n , 3 ) , if   test  1 , - 2 - S n , 3   ( z exp ) = - sra  (  ( z exp ) , S n , 3 ) , if    ( test  1 ) ,

-   -    And:

 ( z exp , S n , 3 ) :=  ( z exp ) + + { - 2 - S n , 3   ( z exp ) = - sra  (  ( z exp ) , S n , 3 ) , if     1 ,  + 2 - S n , 3   ( z exp ) = + sra  (  ( z exp ) , S n , 3 ) , if    (   1 ) , + { - 2 - S n , 3   ( z exp ) = - sra  (  ( z exp ) , S n , 3 ) , if   test  1 , + 2 - S n , 3   ( z exp ) = + sra  (  ( z exp ) , S n , 3 ) , if    ( test  1 ) ,

-   -   -   Do the same to any auxiliary registers such as             (z′_(exp)) and             (z′_(exp)) to apply the multiplication process to these             also, producing             z′_(exp, S) _(n,3) ) and             (z′_(exp, S) _(n,3) ).

    -   10. Apply the shift-and-add process effecting the multiplication         of the 2^(−2S) ^(n,3) term to the exponential registers. As this         is the cross-term of a real and imaginary part, it is guaranteed         imaginary, so it has a more limited set of possible         manifestations.         -   Wherein XOR is the logical binary operator of exclusive-or,             if (             {circumflex over ( )}1) XOR (             {circumflex over ( )}1) then 2^(−2S) ^(n,3)             =−2^(−2S) ^(n,3) i:

(z _(exp)):=

(z _(exp, S) _(n,3) )+sra(

(z _(exp, S) _(n,3) ),2S _(n,3)),

(z _(exp)):=

(z _(exp, S) _(n,3) )−sra(

(z _(exp, S) _(n,3) ),2S _(n,3)),

-   -   -   Whereas if ¬((             {circumflex over ( )}1) XOR (             {circumflex over ( )}1)) then 2^(−2S) ^(n,3)             =+2^(−2S) ^(n,3) i:

(z _(exp)):=

(z _(exp, S) _(n,3) )−sra(

(z _(exp, S) _(n,3) ),2S _(n,3)),

(z _(exp)):=

(z _(exp, S) _(n,3) )+sra(

(z _(exp, S) _(n,3) ),2S _(n,3)),

-   -   -    wherein the signs are reversed in the latter case.         -   Do the same to any auxiliary registers such as             (z′_(exp, S) _(n,3) ) and             (z′_(exp, S) _(n,3) ) to apply the multiplication or             division process to these also, producing             (z′_(exp)) and             (z′_(exp)).

    -   11. Subtract the corresponding entries in the logarithm tables         from the registers:

${\left( z_{\log} \right)}:={{\left( z_{\log} \right)} - \left( {+ \left\{ {\begin{matrix} {{\log_{2}\left( {\left( {1 - 2^{- S_{n,1}}} \right)\sqrt{1 + 2^{{- 2}S_{n,1}}}} \right)},{{{if}\mspace{14mu} }\; 4},} \\ {{\log_{2}\left( {\left( {1 + 2^{- S_{n,1}}} \right)\sqrt{1 + 2^{{- 2}S_{n,1}}}} \right)},{{if}\mspace{14mu} {\left( {\; 4} \right)}}} \end{matrix},\mspace{79mu} {+ \left\{ {\begin{matrix} {{\log_{2}\left( {\left( {1 - 2^{- S_{n,2}}} \right)\sqrt{1 + 2^{{- 2}S_{n,2}}}} \right)},{{{if}\mspace{14mu} }\; 2},} \\ {{\log_{2}\left( {\left( {1 + 2^{- S_{n,2}}} \right)\sqrt{1 + 2^{{- 2}S_{n,2}}}} \right)},{{if}\mspace{14mu} {\left( {\; 2} \right)}}} \end{matrix},\mspace{79mu} {{{+ \left\{ {\begin{matrix} {{\log_{2}\left( {\left( {1 - 2^{- S_{n,3}}} \right)\sqrt{1 + 2^{{- 2}S_{n,3}}}} \right)},{{{if}\mspace{14mu} }\; 1},} \\ {{\log_{2}\left( {\left( {1 + 2^{- S_{n,3}}} \right)\sqrt{1 + 2^{{- 2}S_{n,3}}}} \right)},{{if}\mspace{14mu} {\left( {\; 1} \right)}}} \end{matrix},} \right)}\mspace{20mu} \left( z_{\log,n} \right)}:={{\left( z_{\log} \right)} - \left( {+ \left\{ {\begin{matrix} {{{- \frac{2}{\pi}}\tan^{- 1}2^{- S_{n,1}}},{{{if}\mspace{14mu} }\; 4},} \\ {{{+ \frac{2}{\pi}}\tan^{- 1}2^{- S_{n,1}}},{{{if}\mspace{14mu} }\; 4}} \end{matrix},\mspace{79mu} {+ \left\{ {\begin{matrix} {{{- \frac{2}{\pi}}\tan^{- 1}2^{- S_{n,2}}},{{{if}\mspace{14mu} }\; 2},} \\ {{{+ \frac{2}{\pi}}\tan^{- 1}2^{- S_{n,2}}},{{{if}\mspace{14mu} }\; 2}} \end{matrix},\mspace{79mu} {+ \left\{ {\begin{matrix} {{{- \frac{2}{\pi}}\tan^{- 1}2^{- S_{n,3}}},{{{if}\mspace{14mu} }\; 1},} \\ {{{+ \frac{2}{\pi}}\tan^{- 1}2^{- S_{n,3}}},{{{if}\mspace{14mu} }\; 1}} \end{matrix},} \right)}} \right.}} \right.} \right.}}} \right.}} \right.} \right.}$

-   -   12. Return to step 2 for the next iteration, until N is reached         and the set of step-groups are exhausted up to the required         precision, at which point the registers will contain the final         values for the fractional portion of the calculation.     -   13. Compute range expansion on the values present in the         registers, so:         -   a. If the process is taking logarithmic input and producing             exponential output, then the quadrant number held in the             integer             (z_(integer,log)) is expanded, rotating back via             multiplication of the exponentiated value z_(exp) by the             appropriate value from {1, i, −1, −i}. If the integer part             of the logarithm was not applied, either this may be applied             as a bit shift, or kept as an exponent, allowing the process             to emit a floating-point value.         -   b. If the process is taking exponential input and producing             logarithmic output, then if the integer part of the             logarithm described by the leading zeroes count of the first             step has not yet been applied to the result, add this value.

This process may be modified to accept different conditional testing tables and be extended to different radices. The multiplication approach to build the conditional testing tables in the earlier steps will not be consistent across all 2^(n)-radix radices and iterations, but may be instead obtained through brute force, finding a combination of subsets of the input bits which in a particular pattern of cutoff values generate an ascending or descending set of 2^(n) possible output values which taken in concert generate a lookup for the n sub-iterations that exhibits the desired convergence behavior.

XIX. CLOSING OBSERVATIONS

This disclosure has demonstrated that a reduction in the number of logarithm lookup tables, from eight values per result bit down to three or four, is possible. This is achieved by treating the real and imaginary parts as separate multiplies when looking up the logarithmic representation via the lookup tables of the logarithm values. Further, the subtraction of one present in the exponential-to-logarithm process can be merged in the conditional decision-making structure with negligible impact.

High radix functionality has been demonstrated by reducing the possible choices of shift-and-add multiplications, to the point where many simple bit switches computable at the beginning of a single high radix iteration can trigger many parallelizable logarithm subtraction and exponential multiplications, yielding an algorithm suitable for inclusion into modern high speed integrated circuitry.

XX. EXAMPLE USE CASES FOR BI-DIRECTIONAL BKML4M

It has been shown in BKML4m, which seems to be the most applicable variant of the algorithm taking in account the optimizations for reduced table size, because of the simple implementation coupled with the ability to achieve both logarithm-to-exponential and exponential-to-logarithm modes within the same design. This is useful in that it can be used to reversibly achieve micro-operations potentially dispatching per cycle without flushing and mode switching at a low area cost to complete a greater scope of macro-scale operations than is usually possible. This algorithm is only slightly more expensive than the summed cost of a real binary logarithm and CORDIC unit, but has greater flexibility than any possible implementation that involves these alone in that the operations computed by the unit may be changed on a per-result basis without pipeline flushing.

In the following, it is shown through an example micro-architecture that operations may be completed by using the given invention to efficiently complete all of the more involved arithmetic operations usually consigned to a plethora of sub-units in complex architectures.

For simplicity of illustration all registers in this example of a toy instruction set architecture are complex-valued and include an exponent (as real operations are subsets of the complex-valued operations), $r0 contains a constant read-only zero and $r1 contains a constant read-only one (1.0+0.0i). In a real implementation it is assumed that the details of the inputs and outputs are suitably multiplexed or stubbed to a more realistic register set. The mnemonic then used to call the method block (which may be any bi-directional method from the above set) is:

METHOD <in_log><in_exp><out_log><out_exp><direction> where the auxiliary registers have been left out but may be optionally included for fast (and in the case of divide potentially faster) vector-scalar complex multiply and divide. It should also be noted that a non-zero <direction> yields logarithm-to-exponential, whereas a zero-direction yield exponential-to-logarithm.

Then for example:

Logarithm of $r2 in $r3: METHOD $r0 $r2$r3 $r0 $r0 Exponential of $r2 in $r3: METHOD $r2 $r0 $r0 $r3 $r1

Multiplication of $r2 by $r3 into $r4:

METHOD $r0 $r3 $r5 $r0 $r0 METHOD $r5 $r2 $r0 $r4 $r1

Division of $r2 by $r3 into $r4:

METHOD $r0 $r3 $r5 $r0 $r0 NEGATE $r5 METHOD $r5 $r2 $r4 $r4$r1

Square of $r2 into $r3:

METHOD $r0 $r2 $r4 $r0 $r0 SRA $r5 $r4 1 METHOD $r5 $r0 $r0 $r3 $r1

Square root of $r2 into $r3:

METHOD $r0 $r2$r4 $r0 $r0 SLA $r5 $r4 1 METHOD $r5 $r0 $r0 $r3 $r1

Multiplications and divisions may be accelerated further through the use of the vector auxiliary registers that are not included in the above. By subdividing the real, imaginary and exponent parts of the registers using packing and unpacking instructions, it can be appreciated that sine, cosine, tangent, arcsine, arccosine, arctangent, conversions between floating-point, fixed-point and integer, other base logarithms, exponentials and powers as well as conversions to degrees and radians may be computed using this system in different configurations alongside simple bitwise operations. This allows for a succinct design when many complex-valued operations are required in beam forming applications such as wireless routing, positioning systems, radar as well as applications involving acoustics and ultrasonics, or a requirement for a single efficient block for computing a high density of mathematical operations.

A bizarre quirk of this design means that many arithmetic operations have complexities that differ significantly from traditional designs. For instance, complex-valued vector-by-scalar division is the only high-level operation achievable in one call of the method that is not a logarithm or exponential. In practically all traditional systems this is the most expensive operation to perform, which should lead to a simple approach to detecting an infringing implementation within an instruction set architecture.

XXI. ADDITIONAL DISCLOSURE

1. A system comprising: An implementation in a hardware component implementing a switchable complex-valued to-logarithm and to-exponential unit wherein; The input and output are complex valued; and Shift-and-add processes are applied to registers that effect a separable multiplication of each complex number by one added to a real value and one added to an imaginary value on each iteration. 2. The system of claim 1, wherein the logarithm and exponential processes implemented by the unit are affine logarithm and affine exponential processes. 3. The system of claim 2, wherein the relation:

${\frac{2\tan^{- 1}2^{- p}}{\pi} \approx {{\frac{1}{2}\log_{2}1} + 2^{- p}}},$

is used to approximate the lookup value of the arctangent expression as the existing lookup value of the binary logarithm expression and a smaller delta table 4. The system of claim 2, wherein the imaginary part of the input in the affine logarithm process is tested and if less than negative a half or greater than or equal to a positive half, rotated by 45 degrees prior to the iteration 5. The system of claim 1, wherein the to-logarithm process completes a division of an auxiliary value in parallel on each completion of the method. 6. The system of claim 1, wherein the to-logarithm process conducts the iteration test on an existing register with one subtracted from it 7. A system comprising: An implementation in a hardware component implementing a switchable complex-valued to-logarithm and to-exponential unit wherein; The input and output are complex-valued and; Shift-and-add processes are applied to registers that effect a multiplication of each complex number by one added to both a non-zero real value and a non-zero imaginary value on each iteration. 8. The system of claim 7, wherein the logarithm and exponential processes implemented by the unit are affine logarithm and affine exponential processes. 9. The system of claim 7, wherein a division is computed in parallel on each completion of the method. 10. The system of claim 8, wherein the repeated steps have shifts applied in the shift-and-add that when taken together substantially follow a Fibonacci sequence.

While the foregoing descriptions disclose specific values, any other specific values may be used to achieve similar results. Further, the various features of the foregoing embodiments may be selected and combined to produce numerous variations of improved haptic systems.

XXII. CONCLUSION

In the foregoing specification, specific embodiments have been described. However, one of ordinary skill in the art appreciates that various modifications and changes can be made without departing from the scope of the invention as set forth in the claims below. Accordingly, the specification and figures are to be regarded in an illustrative rather than a restrictive sense, and all such modifications are intended to be included within the scope of present teachings.

Moreover, in this document, relational terms such as first and second, top and bottom, and the like may be used solely to distinguish one entity or action from another entity or action without necessarily requiring or implying any actual such relationship or order between such entities or actions. The terms “comprises,” “comprising,” “has”, “having,” “includes”, “including,” “contains”, “containing” or any other variation thereof, are intended to cover a non-exclusive inclusion, such that a process, method, article, or apparatus that comprises, has, includes, contains a list of elements does not include only those elements but may include other elements not expressly listed or inherent to such process, method, article, or apparatus. An element proceeded by “comprises . . . a”, “has . . . a”, “includes . . . a”, “contains . . . a” does not, without more constraints, preclude the existence of additional identical elements in the process, method, article, or apparatus that comprises, has, includes, contains the element. The terms “a” and “an” are defined as one or more unless explicitly stated otherwise herein. The terms “substantially”, “essentially”, “approximately”, “about” or any other version thereof, are defined as being close to as understood by one of ordinary skill in the art. The term “coupled” as used herein is defined as connected, although not necessarily directly and not necessarily mechanically. A device or structure that is “configured” in a certain way is configured in at least that way but may also be configured in ways that are not listed.

The Abstract of the Disclosure is provided to allow the reader to quickly ascertain the nature of the technical disclosure. It is submitted with the understanding that it will not be used to interpret or limit the scope or meaning of the claims. In addition, in the foregoing Detailed Description, various features are grouped together in various embodiments for the purpose of streamlining the disclosure. This method of disclosure is not to be interpreted as reflecting an intention that the claimed embodiments require more features than are expressly recited in each claim. Rather, as the following claims reflect, inventive subject matter lies in less than all features of a single disclosed embodiment. Thus, the following claims are hereby incorporated into the Detailed Description, with each claim standing on its own as a separately claimed subject matter. 

I claim:
 1. A system comprising: a hardware component having at least one input and at least one output; wherein the hardware component implements a switchable complex-valued unit having a to-logarithm functionality and a to-exponential functionality; wherein the at least one input and the at least one output are complex valued; wherein shift-and-add processes are applied to values in the hardware component that effect a separable multiplication of: i) the at least one input; ii) (1+c); and (1+di); wherein “c” is a real value and “di” is an imaginary value.
 2. The system of claim 1, wherein a logarithm process implemented by the unit is an affine logarithm process; and wherein an exponential processes implemented by the unit are an affine exponential process.
 3. The system of claim 2, wherein the relation: ${\frac{2\tan^{- 1}2^{- p}}{\pi} \approx {{\frac{1}{2}\log_{2}1} + 2^{- p}}},$ is used to approximate a lookup value of an arctangent expression as an existing lookup value of a binary logarithm expression and a smaller delta table.
 4. The system of claim 2, wherein an imaginary part of the input in the affine logarithm process is tested and, if less than −½ or greater than or equal to +½, rotated by 45 degrees prior to an iteration.
 5. The system of claim 1, wherein the to-logarithm functionality completes a division of an auxiliary value in parallel on an iteration.
 6. The system of claim 1, wherein the to-exponential functionality completes a division of an auxiliary value in parallel on an iteration.
 7. The system of claim 1, wherein the to-logarithm functionality conducts an iteration test on a value that is an existing value subtracted by +1.
 8. The system of claim 1, wherein the to-exponential functionality conducts an iteration test on a value that is an existing value subtracted by +1.
 9. The system of claim 1, wherein “c” is also a non-zero value and “di” is also a non-zero value.
 10. The system of claim 9, wherein a logarithm process implemented by the unit is an affine logarithm process; and wherein an exponential processes implemented by the unit are an affine exponential process.
 11. The system of claim 10, wherein the relation: ${\frac{2\tan^{- 1}2^{- p}}{\pi} \approx {{\frac{1}{2}\log_{2}1} + 2^{- p}}},$ is used to approximate a lookup value of an arctangent expression as an existing lookup value of a binary logarithm expression and a smaller delta table.
 12. The system of claim 10, wherein an imaginary part of the input in the affine logarithm process is tested and, if less than −½ or greater than or equal to +½, rotated by 45 degrees prior to an iteration.
 13. The system of claim 9, wherein the to-logarithm functionality completes a division of an auxiliary value in parallel on an iteration.
 14. The system of claim 9, wherein the to-exponential functionality completes a division of an auxiliary value in parallel on an iteration.
 15. The system of claim 9, wherein the to-logarithm functionality conducts an iteration test on a value that is an existing value subtracted by +1.
 16. The system of claim 9, wherein the to-exponential functionality conducts an iteration test on a value that is an existing value subtracted by +1.
 17. The system of claim 9, wherein when iterations of the shift-and-add processes are applied to the values in the hardware component, an aggregation of the values in the hardware component substantially follow a Fibonacci sequence. 